현제의 현재이야기
[TIL] Many to Many에 대한 고찰 본문
OSOD를 만들기 앞서서 좋아요를 누른 문장에 대해서 한 눈에 모으는 기능을 구현하기 위해서 Many to many의 테이블에 대해서 이해가 필요했다. 게시글에서 좋아요를 누른 사람들을 뽑아낼 순 있지만, 내가 무슨 게시글을 좋아요를 눌렀는지 알아보기 위해서 탐구를 시작하였다.
class Post(models.Model):
like_users = models.ManyToManyField(User, related_name='likepost', null=True)
class User(AbstractUser):
password = models.CharField(max_length=512)
email = models.CharField(max_length=50,unique = True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
select = models.CharField(max_length=50, null=True)
profile_image = models.ImageField(upload_to='profile', null=True)
username = models.CharField(max_length=10,unique = True ,null=True)
모델이 이렇게 되어있을 때, Post와 User에 관련된 테이블이 하나 생성된다. id, post_id, user_id로 생성되어서
이와 같은 테이블이 만들어진다. 이는 post 1, 2번을 user 3이 좋아요를 눌렀다는 것이다.
@api_view(['GET'])
def likes_test(request):
target_post = Post.objects.get(pk=2)
target_post = target_post.like_users.all()
target_postDict = [i.id for i in target_post]
target_user = User.objects.get(pk=3)
target_user = target_user.likepost.all()
target_user = [i.id for i in target_user]
return Response(
{
"target_postDict": target_postDict,
"target_user": target_user
}
)
급하게 좋아요를 누른 사람과 내가 좋아요를 누른 게시글을 모아보는 함수를 작성하였다. Post 모델에는 likes_users라는 애트리뷰트가 존재하기 때문에 그냥 target_post.like_users.all()을 해도 쿼리가 불러와진다. 하지만 User 테이블에는 존재하지 않기 때문에 like_users_set을 통해서 불러와야 되는데 모델에서 related_name을 'likepost'로 해두었기 때문에 likepost.all()를 통해서 불러온다.
그러면 이렇게 잘 뜬다. 이를 통해서 내가 쓴 좋아요한 문장 모음도 잘 구현할 수 있을 것이다.
참조 블로그
'DRF' 카테고리의 다른 글
[0130 TIL]Django REST Framework 핵심사항 (0) | 2023.01.30 |
---|---|
[0129 TIL]Django REST Framework 핵심사항 (0) | 2023.01.30 |
DRF 공부 (0) | 2023.01.15 |
Comments