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

这是一个邮政数据库。有什么想法吗?在谷歌上还有更多挖掘,这似乎相关?

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

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

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

顺便说一下,当你没有像你想要的那样快地收到对你的问题的回复时,请避免将 Django 的票证跟踪器作为第二层支持渠道。

最新更新