En Django, ¿cuál es la diferencia entre los dos siguientes:
Article.objects.values_list('comment_id', flat=True).distinct()
vs
Article.objects.values('comment_id').distinct()
Mi objetivo es obtener una lista de identificadores de comentarios únicos debajo de cada uno Article
. He leído la documentación (y de hecho he usado ambos enfoques). Los resultados abiertamente parecen similares.
django
django-models
django-queryset
django-orm
Hassan Baig
fuente
fuente
if self.id in Article.objects.values_list('comment_id', flat=True):
mientras usa valores que necesita para acceder al diccionarioArticle.objects.filter(comment_id=self.id).exists()
?Respuestas:
El
values()
método devuelve un QuerySet que contiene diccionarios:El
values_list()
método devuelve un QuerySet que contiene tuplas:Si está usando
values_list()
un solo campo, puede usarflat=True
para devolver un QuerySet de valores únicos en lugar de 1-tuplas:fuente
distinct()
se usa, ¿eh?distinct()
funcione de manera diferente. Lo importante es con qué estructura de datos desea trabajar.values()
devuelve aQuerySet
y no alist
. Aunque el objeto devuelto porvalues()
parece un alist
, en algunos casos no se comporta como tal. Por ejemplo, no será json serializable a menos que lo convirtamos en una 'lista'values_list
a una verdadera lista de Python simplemente usando lalist
función:list(Article.objects.values_list('comment_id', flat=True).distinct())
valores()
Devuelve un QuerySet que devuelve
dictionaries
, en lugar de instancias de modelo, cuando se usa como iterable.valores_lista ()
Devuelve un QuerySet que devuelve
list of tuples
, en lugar de instancias de modelo, cuando se usa como iterable.distinto()
distintos se utilizan para
eliminate the duplicate
elementos.Ejemplo:
fuente
values
distinct()
elimina los elementos duplicados de los resultados de la consulta, no de la base de datos.Puede obtener los diferentes valores con:
fuente