외래 키 테이블을 기반으로 기본 '즐겨 찾기'시스템을 구현하려고합니다.부울 주석으로 인해 중복이 발생합니까?
의 나는 다음과 같은 간단한 모델을 가지고 있다고 가정 해 봅시다 :
이제class Item(models.Model)
id = models.IntegerField()
class User(models.Model)
id = models.IntegerField()
class UserFavourites(models.Model)
user = models.ForeignKey(User, related_name='user_for_fav_rel')
item = models.ForeignKey(Item, related_name='item_for_fav_rel')
나는 그들이 사용자가 즐겨 찾기로 표시 한 경우 항목에 대한 다음의 검색어보고 생성 :
queryset = Item.objects.all()
USER_ID = request.user.id
queryset = queryset.annotate(
favourite=Case(
When(
item_for_fav_rel__user__id=USER_ID,
then=Value('True')
),
default=Value('False'),
output_field=BooleanField()
)
)
모든 이 작품의 위대한 작품이지만, 응답에 항목이 실제로 favourited 경우, 나는 그 특정 항목의 복사본을 queryset에 나타납니다. 어떤 생각을 어떻게 피할 수 있습니까?
(내가 생각하는 최소한의 예를 아래로 편집 ...)결과 SQL 쿼리
SELECT
"core_item"."id",
CASE
WHEN "core_userfavourites"."user_id" = 1 THEN True
ELSE False
END AS "favourite"
FROM "core_item"
LEFT OUTER JOIN "core_userfavourites"
ON ("core_item"."id" = "core_userfavourites"."item_id")
생성되는 SQL 쿼리는 무엇입니까? –
질문 편집을 참조하십시오 ... – Eric
'all()'을 사용하고'annotate()'를 사용하는 특별한 이유가 있습니까? – scharette