以下显示了不重复计数为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
这是一个postgres数据库。有任何想法吗? 在Google和上进行更多挖掘似乎很相关?
更新: 创建了Django问题this
答案 0 :(得分:1)
您有一个已定义的VirtualMachineResources.Meta.ordering
,它会使ORM感到困惑,因为使用SELECT
时必须在DISTINCT
子句中出现按列排序。使用.count()
时,顺序恰好被清除。
长期存储简短内容,添加一个.order_by()
以将Meta.ordering
放在您要遍历的查询集上,您应该会做得很好。没有一种好的方法可以生成DISTINCT
来排除Django ORM上的排序字段,因为这将需要进行复杂的子查询下推,如#24218中所述。
顺便说一句,当您没有尽快收到对问题的答复时,请避免将Django的票务跟踪器作为第二层支持渠道。