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.
django
django-models
django-queryset
django-orm
Hassan Baig
źródło
źródło
if self.id in Article.objects.values_list('comment_id', flat=True):
używając wartości potrzebnych do uzyskania dostępu do słownikaArticle.objects.filter(comment_id=self.id).exists()
?Odpowiedzi:
values()
Sposób powraca QuerySet zawierający słownikówvalues_list()
Sposób powraca QuerySet zawierający krotki:Jeśli używasz
values_list()
z pojedynczym polem, możesz użyćflat=True
QuerySet do zwrócenia pojedynczych wartości zamiast 1-krotek:źródło
distinct()
jest używane, co?distinct()
działa inaczej. Ważne jest, z jaką strukturą danych chcesz pracować.values()
ZwracaQuerySet
i nie jest tolist
. Chociaż obiekt zwracany przezvalues()
wygląda jak alist
, w niektórych przypadkach nie zachowuje się jak jeden. Na przykład nie będzie można go serializować w formacievalues_list
na prawdziwą listę Pythona, po prostu używająclist
funkcji:list(Article.objects.values_list('comment_id', flat=True).distinct())
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 duplicate
elementów.Przykład:
źródło
values
distinct()
eliminuje zduplikowane elementy z wyników zapytania, a nie z bazy danych.Możesz uzyskać różne wartości za pomocą:
źródło