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.


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]>

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}]

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))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.