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()
我有以下型号:
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()