gpt4 book ai didi

python - 使用反向关系第一行的列注释 Django 查询集

转载 作者:行者123 更新时间:2023-11-28 18:30:57 25 4
gpt4 key购买 nike

我有一个Review 模型和一个ReviewScore ForeignKey,代表某个时间点的分数。简化后,它看起来像这样:

class Review(models.Model):
# Nothing interesting here.


class ReviewScore(models.Model):
review = models.ForeignKey(Review)
date = models.DateField()
score = models.IntegerField()

class Meta:
ordering = ("-date",)

在我看来,我希望用 ReviewScore 表中最近一行的 score 值来注释 Review 查询集(具体来说,我想要一个平均值),这样我就可以按给评论的最新分数排序。

我试过 .annotate(score=F("reviewscore__score")) 但这会返回多行;因此它返回重复的 Review,每个都用不同的 ReviewScore 分数注释,使用 distinct 不能解决这个问题,因为 Postgres 要求 distinct必须匹配 ORDER BY 表达式。

这可能吗?我能否以某种方式过滤或限制使用 .annotate 返回外部表的结果,或者使其仅使用 ReviewScore 表中的第一个结果进行注释?

最佳答案

在最近的 Django 版本中,您可以使用 Subquery expressions在注释中:

from django.db.models import OuterRef, Subquery

scores = ReviewScore.objects.filter(review=OuterRef("pk")).order_by("-date")
reviews = Review.objects.annotate(
latest_score=Subquery(scores.values("score")[:1])
)
sorted_reviews = reviews.order_by('latest_score')

这样,您就可以与数据库无关(例如,它适用于 sqlite3)。

关于python - 使用反向关系第一行的列注释 Django 查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37433349/

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