2 回答
TA贡献2065条经验 获得超14个赞
愚蠢,但原始问题中的代码确实有效。我遇到的问题在其他地方,与此示例无关...:/
原始问题中有一个不正确的陈述:
This does produce the format I need but it aggregates average rating over all reviews, not only the ones by the user and the same story with labels, it just includes all labels applied in all reviews...
实际上并非如此,因此这似乎可以正常工作:
Book.objects.filter(reviews__user=user)
.annotate(average_rating=Avg("reviews__rating"))
.annotate(labels=ArrayAgg("reviews__labels", distinct=True))
TA贡献1828条经验 获得超3个赞
根据您的模型和您的问题描述,听起来您希望通过对特定用户过滤评论的书籍对评论进行分组:
Review.objects.filter(user=user).values('book__name').annotate(
average_rating=Avg(F('rating'))
)
>>> <QuerySet [{'book__name': 'The ultimate code', 'average_rating': 7.0}]>
抱歉,我没有使用 ArrayAgg 进行测试,它是 postgresSQL 特定的聚合函数。
上面的代码是针对包含 2 个评论的数据库执行的,一个评分为 10,另一个评分为 4。
添加回答
举报