【发布时间】:2018-05-06 16:16:27
【问题描述】:
我正在尝试基于外键表实现一个基本的“收藏夹”系统。
假设我有以下简单模型:
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()
)
)
所有这些都很好,但是在响应中,如果该项目确实被收藏了,我会在查询集中收到该特定项目的副本。知道如何避免这种情况吗?
结果 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 查询是什么?
-
查看问题编辑...
-
你使用
all()然后annotate()有什么特别的原因吗? -
@sharette 这是一个使用 django rest 框架的更大程序的一小部分。我正试图快速浏览它。
标签: python django python-3.x django-queryset django-1.11