gpt4 book ai didi

python - 如何在 Django 聚合查询的 GROUP BY 子句中正确包含列?

转载 作者:太空宇宙 更新时间:2023-11-03 19:54:27 24 4
gpt4 key购买 nike

我正在使用 Django 和 Python 3.7。我有以下模型...

class ArticleStat(models.Model):
objects = ArticleStatManager()
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='articlestats')
elapsed_time_in_seconds = models.IntegerField(default=0, null=False)
score = models.FloatField(default=0, null=False)

我想编写一个符合某些条件的 MAX/GROUP BY 查询。具体来说,我希望每一行包含

MAX(ArticleStat.elapsed_time_in_seconds)
ArticleStat.Article.id
ArticleStat.Article.title
ArticleStat.score

其中“ArticleStat.Article.id”、“ArticleStat.Article.title”和“ArticleStat.score”列对于每个结果集行都是唯一的。所以我尝试了这个...

def get_current_articles(self, article):
qset = ArticleStat.objects.values('article__id', 'article__title', 'score').filter(
article__article=article).values('elapsed_time_in_seconds').annotate(\
max_date=Max('elapsed_time_in_seconds'))
print(qset.query)
return qset

但是,生成的 SQL 不包含我想要在 GROUP BY 子句中使用的值(请注意,“article”和“score”都不在 GROUP BY 中)...

SELECT "myproject_articlestat"."elapsed_time_in_seconds", 
MAX("myproject_articlestat"."elapsed_time_in_seconds") AS "max_date"
FROM "myproject_articlestat"
INNER JOIN "myproject_article" ON ("myproject_articlestat"."article_id" = "myproject_article"."id")
WHERE ("myproject_article"."article_id" = 2) GROUP BY "myproject_articlestat"."elapsed_time_in_seconds"

如何修改 Django 查询以生成与我想要的一致的 SQL?

最佳答案

我认为@Oleg 的答案不会起作用,但它已经很接近了..

子查询表达式可用于从另一个查询集中选择单个值。要实现此目的,您可以按您希望定位的值进行排序,然后选择第一个值。

sq = (
ArticleStat.objects
.filter(article=OuterRef('pk'))
.order_by('-elapsed_time_in_seconds')
)
articles = (
Article.objects
.annotate(
max_date=Subquery(sq.values('elapsed_time_in_seconds')[:1]),
score=Subquery(sq.values('score')[:1]),
)
# .values('id', 'path', 'title', 'score', 'max_date')
)

关于python - 如何在 Django 聚合查询的 GROUP BY 子句中正确包含列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59619160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com