필요한 데이터를 불러올 때 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')