首页 > 解决方案 > Django distinct 返回的记录多于计数

问题描述

下面显示了不同的计数是 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数据库。有任何想法吗?在谷歌上有更多的挖掘,似乎相关?

更新:在这里创建了一个 Django 问题

标签: djangodjango-orm

解决方案


您有一个VirtualMachineResources.Meta.ordering混淆 ORM 的定义,因为在使用时,按列排序必须出现在SELECT子句中DISTINCT。使用时恰好清除了排序.count()

长存储短,添加一个.order_by()以将您Meta.ordering放在您正在迭代的查询集上,您应该很高兴。没有好的方法可以生成DISTINCT排除 Django 的 ORM 上的排序字段的好方法,因为这需要复杂的子查询下推,如#24218中所述。

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


推荐阅读