【问题标题】:Django Values + Annotate Avg() doesn't group properlyDjango Values + Annotate Avg() 没有正确分组
【发布时间】:2021-07-04 13:37:57
【问题描述】:

我陷入了这个明显的基本问题,感觉我错过了一些明显的东西来使它正常工作。

我的数据库模型是:

class Review(models.Model):

SCORE_CHOICES = [(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5')]

user = models.ForeignKey(get_user_model(), related_name="reviews_by_user", on_delete=models.CASCADE)
recipe = models.ForeignKey(Recipe, related_name="reviews_by_recipe", on_delete=models.CASCADE)
score = models.IntegerField(choices=SCORE_CHOICES)
date_created = models.DateTimeField(default=timezone.now)

def __str__(self):
    return f"{self.user} rated {self.recipe} with {self.score}"

class Meta:
    ordering = ['-date_created']

我正在尝试按食谱计数平均评论分数进行分组。 这种方法感觉很好,但它没有:

Review.objects.values('recipe').annotate(Avg('score'))

结果我得到:

<QuerySet [{'recipe': 1, 'score__avg': 5.0}, {'recipe': 1, 'score__avg': 5.0}, {'recipe': 2, 'score__avg': 4.0}, {'recipe': 2, 'score__avg': 3.0}, {'recipe': 5, 'score__avg': 3.0}, {'recipe': 5, 'score__avg': 2.0}]>

这对我来说绝对是奇怪的。它应该对食谱进行分组,但相反,它计算每一行的平均值。我浏览了 Django Aggregation 文档,但找不到任何可以帮助理解我所缺少的限制或特殊条款。

如果有人知道发生了什么,请告诉我。

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    解决了!

    .order_by() 方法最终“完成”这样的分组

    所以:

    Review.objects.values('recipe').annotate(Avg('score')).order_by()
    

    结果:

    <QuerySet [{'recipe': 1, 'score__avg': 5.0}, {'recipe': 2, 'score__avg': 3.5}, {'recipe': 5, 'score__avg': 2.5}]>
    

    【讨论】:

    猜你喜欢
    • 2020-06-19
    • 2015-10-17
    • 1970-01-01
    • 2021-09-19
    • 2017-01-15
    • 1970-01-01
    • 2017-10-10
    • 2018-06-13
    相关资源
    最近更新 更多