현제의 현재이야기

[TIL] Many to Many에 대한 고찰 본문

DRF

[TIL] Many to Many에 대한 고찰

현재의 현제 2023. 1. 30. 21:35

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()를 통해서 불러온다.

그러면 이렇게 잘 뜬다. 이를 통해서 내가 쓴 좋아요한 문장 모음도 잘 구현할 수 있을 것이다.

 

참조 블로그

 

Django 9. ManyToManyField 1

1. Many-to-Many relationship 데이터베이스의 Many-to-Many relationship(이하 다대다 관계)는 처음 접하는 사람들을 힘들게 한다. 한 테이블의 여러 레코드가 다른 테이블의 여러 레코드와 연결되어 있는 관계

velog.io

 

'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