Django values_list vs values

146

Was ist in Django der Unterschied zwischen den folgenden beiden:

Article.objects.values_list('comment_id', flat=True).distinct()

vs.

Article.objects.values('comment_id').distinct()

Mein Ziel ist es, eine Liste mit eindeutigen Kommentar-IDs unter jedem zu erhalten Article. Ich habe die Dokumentation gelesen (und tatsächlich beide Ansätze verwendet). Die Ergebnisse scheinen offensichtlich ähnlich zu sein.

Hassan Baig
quelle
Mit values_list können Sie tun, if self.id in Article.objects.values_list('comment_id', flat=True):während Sie Werte verwenden, die Sie benötigen, um auf das Wörterbuch
zuzugreifen
1
@dnaranjo - Du könntest aber warum nicht einfach machen Article.objects.filter(comment_id=self.id).exists()?
Sayse
1
Das ist eine Antwort auf eine andere Frage
Dnaranjo

Antworten:

250

Die values()Methode gibt ein QuerySet zurück, das Wörterbücher enthält:

<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>

Die values_list()Methode gibt ein QuerySet zurück, das Tupel enthält:

<QuerySet [(1,), (2,)]>

Wenn Sie values_list()ein einzelnes Feld verwenden, können Sie flat=Trueein QuerySet mit einzelnen Werten anstelle von 1-Tupeln zurückgeben:

<QuerySet [1, 2]>
Alasdair
quelle
Oh und kein Unterschied zwischen den beiden gegenüber, wie distinct()wird verwendet, nicht wahr?
Hassan Baig
2
Nein, ich denke nicht, distinct()dass es anders funktioniert. Wichtig ist, mit welcher Datenstruktur Sie arbeiten möchten.
Alasdair
3
Das values()gibt a QuerySetund nicht a zurück list. Obwohl das von zurückgegebene Objekt values()wie a aussieht list, verhält es sich in einigen Fällen nicht wie eines. Zum Beispiel wird es nicht json serialisierbar sein, es sei denn, wir konvertieren es in eine "Liste"
Abhijit Ghate
@AbhijitGhate guter Punkt, ich habe die Antwort aktualisiert, um das klarer zu machen.
Alasdair
2
Sie können die Rückkehr von values_listin eine echte Python-Liste leicht konvertieren, indem Sie einfach die listFunktion verwenden:list(Article.objects.values_list('comment_id', flat=True).distinct())
inostia
54

Werte()

Gibt ein QuerySet zurück dictionaries, das bei Verwendung als Iterable anstelle von Modellinstanzen zurückgibt .

values_list ()

Gibt ein QuerySet zurück list of tuples, das bei Verwendung als Iterable anstelle von Modellinstanzen zurückgibt .

unterscheiden ()

verschiedene sind an eliminate the duplicateElemente gewöhnt.

Beispiel:

Article.objects.values_list('id', flat=True) # flat=True will remove the tuples and return the list   
[1, 2, 3, 4, 5, 6]

Article.objects.values('id')
[{'id':1}, {'id':2}, {'id':3}, {'id':4}, {'id':5}, {'id':6}]
Ibrahim Kasim
quelle
2
Es ist also eine Liste von Wörterbüchern, die im Fall vonvalues
Hassan Baig
Nur zur Verdeutlichung: distinct()Entfernt die doppelten Elemente aus den Abfrageergebnissen, nicht aus der Datenbank.
oz19
5

Sie können die verschiedenen Werte erhalten mit:

set(Article.objects.values_list('comment_id', flat=True))
pitu
quelle