Ho un capriccio con Django filtraggio set di query (?):Django objects.filter() values_list() vs lista di pitone di comprensione per la query __in
ipdb> MagazineIssue.objects.filter(id__in=l_magazines.values_list('id'))
Out[0]: []
o
ipdb> MagazineIssue.objects.filter(id__in=[l_magazine.id for l_magazine in l_magazines])
Out[0]: [<MagazineIssue: Architecture Australia, Jan 1995 (#1)>]
e
ipdb> l_magazines.values_list('id')
Out[0]: [(1,)]
ipdb> [l_magazine.id for l_magazine in l_magazines]
Out[0]: [1]
quindi, come usare values_list()? (per produrre):
[1]
oppure la lista dei pitoni è la 'strada da percorrere'?
C'è una differenza di prestazioni? – Marcin
Enorme. values_list è waay più veloce. flat = true lo rende ancora più veloce perché python non ha bisogno di creare un'istanza di tutti gli oggetti nell'elenco, vengono restituiti solo i valori del database. –
per chiarire, è più veloce perché Django riconosce che stiamo usando un queryset come argomento per un queryset, quindi li combina entrambi in una singola query - non valuta prima il queryset 'values_list' in una lista! – Anentropic