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()的主要内容,如果未能解决你的问题,请参考以下文章

注释不同的 Django 查询集不再使用不同的查询集

Django:结合来自两个过滤器查询的两个计数注释

Django查询带注释并选择相关的一起

如何在 django 注释中从 0 开始计数?

使用注释时在 Django 中显示选择字段的名称

sql中count是啥含义