Django[queryset] - filter() 기능 팁

이주명·2021년 12월 5일
0
post-custom-banner

필요한 데이터를 불러올 때 filter()기능을 많이 사용할 것이다.
filter()를 사용할 때 알아두면 좋을 팁 몇가지를 소개하겠다!

filter() 란?

filter()기능은 sql문법으로 조건문에 and를 붙여주는 것과 같습니다.

----------mysql----------------
select * from users where age>20 and height>170
----------django queryset------
User.objects.filter(age>20, height>170)

위와 같이 조건문으로 두가지 조건을 줄때 and를 수행합니다.

또한 필요한 경우 filter () 안에 filter()함수를 이용 할수 있습니다.

이때는 깔끔하게 나타내기 위해 변수 하나를 선언하여 1차 filter문을 사용하여 값을 얻어내고 그 값으로 2차 filter 문에 넣으면 가독성이 좋다.

예시

queryset = Posting.objects.filter(keyword_id=86).values('user_id')

이런 형식으로 keyword_id=86인 애들의 user_id를 구하고 싶다고 가정하고 queryset 변수에 넣어준다.

user = Posting.objects.select_related()values('user_id','post_count').annotate(post_count=Count('user_id')).filter(user_id=queryset).order_by('-post_count')

keyword에 따른 유저 아이드를 얻어낸 값으로 posting table에서
user_id들의 갯수를 count 하고 싶은 쿼리이다.

이때 주목해야 할 점은 위와 같이 작성하면 이러한 에러를 맞닥드릴 것이다.

이 뜻은 filter()함수에서 하나의 인자를 받아야하는데 여러개의 인자를 받은 경우이다 해결 법은 __in 을 사용하면 된다.

위 코드의 마지막 부분인 user_id = queryset 부분을 __in을 붙여 주면 된다.

.filter(user_id__in=queryset).order_by('-post_count')

profile
oh yeah
post-custom-banner

0개의 댓글