Django values_list vs wartości

146

W Django, jaka jest różnica między następującymi dwoma:

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

vs

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

Moim celem jest uzyskanie listy unikalnych identyfikatorów komentarzy pod każdym z nich Article. Przeczytałem dokumentację (i faktycznie użyłem obu podejść). Wyniki jawnie wydają się podobne.

Hassan Baig
źródło
Z values_list możesz to zrobić if self.id in Article.objects.values_list('comment_id', flat=True):używając wartości potrzebnych do uzyskania dostępu do słownika
dnaranjo
1
@dnaranjo - Możesz, ale dlaczego po prostu tego nie zrobić Article.objects.filter(comment_id=self.id).exists()?
Sayse
1
To odpowiedź na inne pytanie
dnaranjo

Odpowiedzi:

250

values()Sposób powraca QuerySet zawierający słowników

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

values_list()Sposób powraca QuerySet zawierający krotki:

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

Jeśli używasz values_list()z pojedynczym polem, możesz użyć flat=TrueQuerySet do zwrócenia pojedynczych wartości zamiast 1-krotek:

<QuerySet [1, 2]>
Alasdair
źródło
Aha i nie ma różnicy między tymi dwoma, a jak distinct()jest używane, co?
Hassan Baig
2
Nie, myślę, że nie distinct()działa inaczej. Ważne jest, z jaką strukturą danych chcesz pracować.
Alasdair
3
W values()Zwraca QuerySeti nie jest to list. Chociaż obiekt zwracany przez values()wygląda jak a list, w niektórych przypadkach nie zachowuje się jak jeden. Na przykład nie będzie można go serializować w formacie
JSON,
@AbhijitGhate Dobra uwaga, zaktualizowałem odpowiedź, aby była jaśniejsza.
Alasdair
2
Możesz łatwo przekonwertować zwrot z values_listna prawdziwą listę Pythona, po prostu używając listfunkcji:list(Article.objects.values_list('comment_id', flat=True).distinct())
inostia
55

wartości ()

Zwraca QuerySet, który zwraca dictionaries, a nie wystąpienia modelu, gdy jest używany jako iterowalny.

lista_wartości ()

Zwraca QuerySet, który zwraca list of tuples, a nie wystąpienia modelu, gdy jest używany jako iterowalny.

odrębny()

odrębne są używane do eliminate the duplicateelementów.

Przykład:

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
źródło
2
Jest to więc lista słowników, która została zwrócona w przypadkuvalues
Hassan Baig
Dla wyjaśnienia: distinct()eliminuje zduplikowane elementy z wyników zapytania, a nie z bazy danych.
oz19
5

Możesz uzyskać różne wartości za pomocą:

set(Article.objects.values_list('comment_id', flat=True))
pitu
źródło