【发布时间】:2016-03-20 23:32:56
【问题描述】:
我正在使用 Django 1.6 和 PostgreSQL 并具有以下模型:
# models.py
class Game(AbstractContentModel, AbstractScoreModel):
name = models.CharField(_("name"), max_length=100, blank=True)
developer = models.CharField(_('Developer'), max_length=255)
distributor = models.CharField(_('Distributor'), max_length=255, blank=True)
# ...
reviews = models.ManyToManyField(Review, related_name="games", blank=True, verbose_name=_("Reviews"))
videos = models.ManyToManyField(Video, related_name="games", blank=True, verbose_name=_("Videos"))
images = models.ManyToManyField(Image, related_name="games", blank=True, verbose_name=_("Gallery"))
我正在尝试获取所有游戏,并为每个游戏添加相关视频、评论和图像的数量,如下所示:
# views.py
qs = Game.objects.all()
qs = qs.annotate(video_count=models.Count('videos'))
qs = qs.annotate(review_count=models.Count('reviews'))
qs = qs.annotate(image_count=models.Count('images'))
查询结果为:
SELECT
"content_game"."id",
"content_game"."name",
"content_game"."developer",
"content_game"."distributor",
COUNT("content_game_videos"."video_id") AS "video_count",
COUNT("content_game_reviews"."review_id") AS "review_count",
COUNT("content_game_images"."image_id") AS "image_count"
FROM "content_game"
LEFT OUTER JOIN "content_game_videos" ON ( "content_game"."id" = "content_game_videos"."game_id" )
LEFT OUTER JOIN "content_game_reviews" ON ( "content_game"."id" = "content_game_reviews"."game_id" )
LEFT OUTER JOIN "content_game_images" ON ( "content_game"."id" = "content_game_images"."game_id" )
GROUP BY
"content_game"."id",
"content_game"."name",
"content_game"."developer",
"content_game"."distributor";
我的问题是 - 为什么 GROUP BY 子句中有所有选定的字段?最重要的是,除了原始 SQL,我该如何摆脱它们?
我收集到使用.values() 会很好,但我想要结果查询中的每个字段。如果我只是使用GROUP BY "content_game"."id",结果是一样的,但是我不知道如何在Django ORM中使用它。
【问题讨论】:
-
My question is - why there are all selected fields in GROUP BY clause? And most importantly, how can I get rid of them besides raw SQL?Postgresql 不是 MySQL more_info 只需尝试在GROUP BY中仅使用 "content_game"."id" 执行原始查询 -
@lad2025 谢谢,问题出在 MySQL 与 PostgreSQL 之间。但如果我真的不需要,我不想使用原始 SQL。我发现此错误已由 code.djangoproject.com/ticket/19259 修复,但我没有看到解决方案。顺便说一句,Django 版本是 1.6,我会将其添加到我的问题中。
-
最后我通过不计算查询中的相关项目来解决它。我已经在 Game 模型上创建了字段 images_count 和 videos_count,并且我在保存和删除时更新了这些字段。至少这样它总是最适合观看:)
标签: python sql django postgresql orm