问题描述
我有以下模型:
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)]
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()