下面显示非重复计数为 2247
In [6]: VirtualMachineResources.objects.all().values('machine', 'cluster')
...: .distinct().count()
Out[6]: 2247
但是当我循环遍历它时,它返回的比它应该返回的要多得多:
In [4]: a = []
...: for resource in VirtualMachineResources.objects.all().values('mach
...: ine', 'cluster').distinct():
...: if resource['cluster']:
...: a.append(resource['cluster'])
...:
...:
In [5]: len(a)
Out[5]: 96953
鉴于记录的集群字段为空,当我遍历查询集时,我可以看到同一台机器的很多重复没有集群值,但我只期望一次。
for resource in VirtualMachineResources.objects.all().values('machine', 'cluster').distinct():
print(resource['machine'], resource['cluster'])
指纹。。。
server1
server1
server1
这是一个邮政数据库。有什么想法吗?在谷歌上还有更多挖掘,这似乎相关?
更新:在这里创建了一个 Django 问题
您有一个定义混淆 ORM 的VirtualMachineResources.Meta.ordering
,因为使用 DISTINCT
时,按列排序必须出现在 SELECT
子句中。使用.count()
时,顺序恰好被清除。
长存储短,添加一个.order_by()
以将Meta.ordering
放在要迭代的查询集上,您应该可以开始了。目前还没有好方法可以生成一个排除 Django ORM 上排序字段的DISTINCT
,因为这需要一个复杂的子查询下推,如 #24218 中所述。
顺便说一下,当你没有像你想要的那样快地收到对你的问题的回复时,请避免将 Django 的票证跟踪器作为第二层支持渠道。