본문 바로가기
웹개발/django

[Django] fk의 field를 filtering 하기 (ORM)

by julysein 2022. 1. 31.
728x90

검색을 해야 하는데 단순히 model이 포함하고 있는 field만 filtering 가능한 줄 알고 여지껏 노가다(?)를 했던 나 자신을 반성하며 쓰는 글...

내가 SQL을 배웠다면 진작 알았을 텐데 미뤄놨던 SQL 공부도 시작해봐야겠다 ㅠㅠ

filter가 SQL에서 어떤식으로 구현되는지에 대해 적혀있는 글들을 많이 보기는 했었는데 SQL 구문을 모르니 항상 그냥 그렇구나 하고 넘어가기만 했었다. 근데 SQL에서는 fk들을 다 저장(?)해두고 있었던 것...!

 

이제부터 댓글들 중에서 특정 휴대폰번호를 가진 유저가 작성한 글에 대한 댓글들만 filtering을 해보자

models.py는 다음과 같다

class User(AbstractBaseUser, PermissionsMixin):
    user_name = models.CharField('이름', max_length=10)
    photo = models.ImageField('프로필 사진', upload_to=uuid_name, blank=True, null=True)
    date_of_birth = models.DateField('생년월일', blank=True, null=True)
    ...
    
class Post(AbstractBaseUser, PermissionsMixin):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="post")
    category = models.CharField('카테고리', max_length=32, choices=Category.CATEGORY.value)
    content = models.TextField(verbose_name='유저 CS 상세 내용')
    ...
    
class Comment(AbstractBaseUser, PermissionsMixin):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="commment")
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="comment")
    content = models.TextField(verbose_name='댓글 내용')

 

이때, 특정 사람의 핸드폰번호가 01012345678이라고 하자.

그럼 [댓글들 중에서 특정 핸드폰번호를 가진 유저가 작성한 글에 대한 댓글]은 다음과 같이 구할 수 있다

comments_queryset = Comment.objects.filter(user__author__phone="01012345678")

이렇게 하면 결과물(comments_queryset)에 모델 comment의 배열이 담기게 된다.

user__author__phone에서 사용된 '__'는 comment.author.phone 이것과 같은 방식이라고 볼 수 있다. 

 

728x90