QuerySet slicing 에러

TeetyWoo·2021년 11월 7일
0

Django

목록 보기
7/11


The QuerySet value for an exact lookup must be limited to one result using slicing.
정확한 조회를 위한 쿼리셋 밸류는 슬라이싱을 활용한 하나의 결과로 제한되어야 한다.


테마 디테일 페이지에서
현재 보고 있는 테마에 대한 리뷰 중 좋아요가 가장 많은 리뷰를 가져오고 싶었다.
모델을 어떻게 필터링 할지 고민하다가, like 모델을 가져와서 현재 보고있는 리뷰를 필터링 걸었는데 쿼리셋 슬라이싱 에러가 발생했다.

문제의 코드

review = ThemeRev.objects.filter(theme_ID=theme_pk)
like = Like.objects.filter(article=review)

장고에서 filter 메소드는 SQL의 WHERE절로서, 조건에 맞는 한 개 이상의 쿼리 셋을 리턴하는데, 이때 조건으로 쿼리셋을 사용하면 위와 같은 에러가 발생한다.
즉, 쿼리셋에 해당하는 review를 그대로 조건으로 가져온 것이 문제

고친 코드

review = ThemeRev.objects.filter(theme_ID=theme_pk)
like = Like.objects.filter(article__in=review)

장고의 in은 튜플, 리스트, 쿼리셋 등 반복 가능한 객체를 조회한다. SQL문에서의 WHERE IN과 같은 역할을 한다.

단! 쿼리셋으로 in 조회를 사용해 values나 values_list를 사용할 때는 하나의 필드만 뽑아내야 한다.

like = Like.objects.filter(article__in=review).values('user', 'article')

과 같이 두개 이상의 필드를 리턴하면 type error가 발생한다.


참조 블로그

[Jacob]
https://dev-jacob.tistory.com/entry/Django-QuerySet-Value-에러-해결하기

0개의 댓글

관련 채용 정보