Django - 如何注释不同值的 count()
Posted
技术标签:
【中文标题】Django - 如何注释不同值的 count()【英文标题】:Django - How to annotate count() of distinct values 【发布时间】:2020-10-16 05:29:49 【问题描述】:我有以下型号:
class Bank(model.Model):
name: models.CharField
....
使用以下示例数据:
╔══════════════╗
║ Row ID, Name ║
╠══════════════╣
║ 1, ABC ║
║ 2, ABC ║
║ 3, XYZ ║
║ 4, MNO ║
║ 5, ABC ║
║ 6, DEF ║
║ 7, DEF ║
╚══════════════╝
我想像这样提取不同的银行名称:
[('ABC', 3), ('XYZ', 1), ('MNO', 1), ('DEF', 2)]
我尝试过使用 annotate 和 distict 但出现以下错误:
NotImplementedError: annotate() + distinct(fields) is not implemented.
我也遇到过关于 SO 的以下问题:
Question 1
哪个有使用 models.Count('name', distinct=True)
的答案,但它返回重复值。
如何使用 Django ORM 处理这个问题?
【问题讨论】:
【参考方案1】:您可以 GROUP BY 查询,
from django.db.models import Count
qs = Bank.objects.values('name').annotate(count=Count('name'))
你会得到这样的结果,
['name': 'BAR', 'count': 1, 'name': 'FOO', 'count': 3]
【讨论】:
你应该使用count=Count('name')
来获取GROUP BY查询
这很好,但是,它真的需要吗? @ruddra
这仍然返回重复值。我不断收到:['name': 'BAR', 'count': 1, 'name': 'FOO', 'count': 3, 'name': 'BAR', 'count': 1]
@RedgrenGrumbholdt 然后,最好使用@ruddra 提到的Count('name')
。【参考方案2】:
Arakkal Abu's Answer 适用于某些行,但返回了一些重复项。我不知道为什么,但我在他的建议中添加了以下内容:
qs = Bank.objects.values('name').annotate(count=Count('id')).order_by('name').distinct()
这让我意识到引发的异常说:distinct(fields) 没有实现,不是distinct()
。
另外,在@ruddra 关于使用Count('name')
而不是Count('id')
的输入中,我没有看到它们之间的区别。它们都返回了相同的结果。
所以以下方法也有效:
qs = Bank.objects.values('name').annotate(count=Count('name')).order_by('name').distinct()
【讨论】:
以上是关于Django - 如何注释不同值的 count()的主要内容,如果未能解决你的问题,请参考以下文章