Django-如何注释不同值的count

问题描述

我有以下模型:

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',('DEF',2)]

我尝试使用注释和distict,但出现以下错误

NotImplementedError: annotate() + distinct(fields) is not implemented.

我在SO上也遇到了以下问题:

std::thread::hardware_concurrency()

关于使用models.Count('name',distinct=True)的答案,但返回的是重复值。 如何使用Django ORM处理此问题?

解决方法

您可以按查询分组,

from django.db.models import Count

qs = Bank.objects.values('name').annotate(count=Count('name'))

您将得到结果,

[{'name': 'BAR','count': 1},{'name': 'FOO','count': 3}]
,

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