Django Unique返回的记录多于计数

时间:2019-01-24 20:02:22

标签: django django-orm

以下显示了不重复计数为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和enter image description here上进行更多挖掘似乎很相关?

更新: 创建了Django问题this

1 个答案:

答案 0 :(得分:1)

您有一个已定义的VirtualMachineResources.Meta.ordering,它会使ORM感到困惑,因为使用SELECT时必须在DISTINCT子句中出现按列排序。使用.count()时,顺序恰好被清除。

长期存储简短内容,添加一个.order_by()以将Meta.ordering放在您要遍历的查询集上,您应该会做得很好。没有一种好的方法可以生成DISTINCT来排除Django ORM上的排序字段,因为这将需要进行复杂的子查询下推,如#24218中所述。

顺便说一句,当您没有尽快收到对问题的答复时,请避免将Django的票务跟踪器作为第二层支持渠道。