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

kin*_*aii 5 django django-orm distinct-values

我有以下模型:

\n
class Bank(model.Model):\n    name: models.CharField\n    ....\n
Run Code Online (Sandbox Code Playgroud)\n

使用以下示例数据:

\n
\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 Row ID, Name \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 1, ABC       \xe2\x95\x91\n\xe2\x95\x91 2, ABC       \xe2\x95\x91\n\xe2\x95\x91 3, XYZ       \xe2\x95\x91\n\xe2\x95\x91 4, MNO       \xe2\x95\x91\n\xe2\x95\x91 5, ABC       \xe2\x95\x91\n\xe2\x95\x91 6, DEF       \xe2\x95\x91\n\xe2\x95\x91 7, DEF       \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n
Run Code Online (Sandbox Code Playgroud)\n

我想提取不同的银行名称,如下所示:

\n
[(\'ABC\', 3), (\'XYZ\', 1), (\'MNO\', 1), (\'DEF\', 2)]\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试使用 annotate 和 distect 但出现以下错误:

\n
NotImplementedError: annotate() + distinct(fields) is not implemented.\n
Run Code Online (Sandbox Code Playgroud)\n

我还遇到了以下问题:

\n

问题1

\n

其中有关于使用的答案models.Count(\'name\', distinct=True),但它返回重复的值。\n我如何使用 Django ORM 处理这个问题?

\n

JPG*_*JPG 7

您可以GROUP BY查询,

from django.db.models import Count

qs = Bank.objects.values('name').annotate(count=Count('name'))
Run Code Online (Sandbox Code Playgroud)

你会得到如下结果:

[{'name': 'BAR', 'count': 1}, {'name': 'FOO', 'count': 3}]
Run Code Online (Sandbox Code Playgroud)


kin*_*aii 1

Arakkal Abu 的答案适用于某些行,但返回了一些重复项。我不知道为什么,但我在他的建议中添加了以下内容:

qs = Bank.objects.values('name').annotate(count=Count('id')).order_by('name').distinct()
Run Code Online (Sandbox Code Playgroud)

这让我意识到引发的异常表示:distinct(fields)未实现,而不是distinct()

另外,在 @ruddra 关于使用Count('name')而不是 的输入中Count('id'),我还没有看到它们之间的区别。他们都返回相同的结果。

所以以下也有效:

qs = Bank.objects.values('name').annotate(count=Count('name')).order_by('name').distinct()
Run Code Online (Sandbox Code Playgroud)