Django - 如何注释不同值的 count()

Django - How to annotate count() of distinct values

我有以下型号:

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 处理这个问题?

可以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}]

对某些行有效,但返回了一些重复项。我不知道为什么,但我在他的建议中添加了以下内容:

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()