【问题标题】:Django: NotImplementedError: aggregate() + distinct(fields) not implementedDjango:NotImplementedError:聚合()+不同(字段)未实现
【发布时间】:2021-01-20 11:27:38
【问题描述】:

我有一个名为评论的表格。在评论中,一个人可以为一项服务留下多条评论。评论可以有总分。我正在尝试获得不同评论的总分平均值。这是我所拥有的:

reviews = Review.objects.distinct('pairing').aggregate(Avg('total_score'));

我不断收到此错误:

NotImplementedError: aggregate() + distinct(fields) not implemented.

有人可以帮我吗?我对 Django 很陌生,不知道为什么会这样。谢谢!

【问题讨论】:

  • pairingForeignKey 吗?可以分享一下相关模型吗?

标签: python django aggregate django-queryset distinct


【解决方案1】:

您可以使用values(…) [Django-doc] 执行此操作,然后创建一个Avg

from django.db.models import Avg

reviews = Review.objects.values('pairing').aggregate(
    avg_total_score=Avg('total_score')
).order_by('pairing')

这将创建一个QuerySet 的字典,如下所示:

<QuerySet [
    {'pairing': 13, 'avg_total_score': 1.3},
    {'pairing': 14, 'avg_total_score': 2.7},
    {'pairing': 21, 'avg_total_score': 1.8},
    {'pairing': 25, 'avg_total_score': 3.9},
]>

【讨论】:

  • 这将采用查询集的唯一配对吗?例如,可能有 2 个评分具有相同的配对,但我试图仅获得具有唯一评分的第一个评分
  • @TotiCuervo:如果相同的pairing 出现多次,则结果中将出现一次,avg_total_score 将是所有带有 的记录的平均值 total_score pairing.
  • 感谢您的回答!但是,我正在寻找的是整个查询的平均值。使用状态的目的是只获得具有特定配对的第一个评级。例如,如果我有一个查询集 {'pairing': 1, 'total_score': 1.3}, {'pairing': 1, 'total_score': 2.7}, {'pairing': 2, 'total_score': 1.8},那么它只会取 {'pairing': 1, 'total_score': 2.7}, {'pairing': 2, 'total_score': 1.8}的平均总分,
  • @TotiCuervo: 如果pairingForeignKey,那么在它指向的模型上执行.annotate(..) 会更优雅,因为从那时起你就有了(假设模型存在@ 987654334@ 个对象)具有额外的属性。
  • @TotiCuervo:但问题是没有“第一”之类的东西。您应该考虑“无序”表。这只是一个事实上的排序,但是数据库可以按照它想要的任何顺序返回记录,除非你有一个排序条件。
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
相关资源
最近更新 更多