many to many를 이해해보자(좋아요 리스트 기능 구현)

이정민·2021년 6월 17일
0

전체적인 모델링은 생략하고 users, likes, products 의 many to many의 관계를 설명하려고 한다. (다른 테이블은 신경쓰지 않아도 된다.)

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키))

profile
안녕하세요.

0개의 댓글