kin*_*aii 5 django django-orm distinct-values
我有以下模型:
\nclass 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 但出现以下错误:
\nNotImplementedError: annotate() + distinct(fields) is not implemented.\n
Run Code Online (Sandbox Code Playgroud)\n我还遇到了以下问题:
\n\n其中有关于使用的答案models.Count(\'name\', distinct=True)
,但它返回重复的值。\n我如何使用 Django ORM 处理这个问题?
您可以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)
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)
归档时间: |
|
查看次数: |
3729 次 |
最近记录: |