models.ManyToManyField('products.Product', through='Like')
위의 코드에서 through는 중간테이블의 이름을 정해주는 속성이다.
many to many관계를 만들어 줄 때는 따로 중간 테이블을 만들지 않아도 models.ManyToManyField()를 속성으로 넣게 되면 데이터베이스상에서 중간 테이블이 따로 생기게 된다.
하지만 모델링을 하다보면 중간 테이블 역할을 하는 테이블이 생길때가 있다.
위의 모델링을 보면 likes가 그 경우다.
users는 '좋아요!'를 여러종류의 products에 할 수 있다.
또한, products는 '좋아요!'를 여러users에게 받을 수 있다.
이런경우 likes('좋아요!')테이블이 users와 products의 중간테이블 역할을 하게 된다.
이런경우 사용할 수 있는 속성이 through다.
위 사진의 내용중
like = models.ManyToManyField('products.Product', through='Like')를 해석해보자.
products.Product는 products앱에 있는 Product테이블을 Many필드로 지정한다는 것이다.
throught='Like'는 User테이블과 Product테이블의 중간테이블을 Like테이블로 지정한다는 것이다.
ManyToMany를 이해했으니 코드를 작성해보자.
@login_decorator를 통해 로그인 된 사람만 '좋아요리스트'를 볼 수 있게 해준다.
@login_decorator코드 내용
로그인한 유저의 토크값을 받아서 request.user에 유저객체를 넣어준다.
for product in request.user.like.all()를 통해서 좋아요한 상품들을 전부 뽑아서 product_list에 각각 상품들을 넣어준다.
request.user == login_decorator을 통해서 로그인한 사용자 정보
request.user.like.all() == QuerySet으로 묶인 '좋아요'한 상품들의 모든 정보
request.user.like (여기서 like는 User뷰의 속성)를 하면 중간테이블을 거쳐서 바로 Product뷰를 참조한다.
그래서 쉽게 설명하자면 request.user.like에서 like는 (like_set.product랑 같다.) (product는 like안에 있는 product속성(Foreign키))