Django отчетливо возвращает больше записей, чем количество - PullRequest
0 голосов
/ 24 января 2019

Ниже показано, что различное число равно 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 здесь

1 Ответ

0 голосов
/ 25 января 2019

У вас есть определенный VirtualMachineResources.Meta.ordering, который сбивает с толку ORM, поскольку упорядоченные по столбцам должны появляться в предложении SELECT при использовании DISTINCT. Порядок сбрасывается при использовании .count().

Долго храните short, добавьте .order_by(), чтобы добавить Meta.ordering в набор запросов, по которому вы выполняете итерацию, и вы должны быть в порядке. Нет хорошего способа сгенерировать DISTINCT, который исключает поля упорядочения в ORM Джанго, но это потребовало бы сложного нажатия на подзапрос, как описано в # 24218 .

Кстати, пожалуйста, избегайте отслеживания билетов Django в качестве канала поддержки второго уровня, когда вы не получаете ответ на свой вопрос так быстро, как вам бы того хотелось.

...