Lista de valores de Django frente a valores

Resuelto Hassan Baig asked hace 8 años • 5 respuestas

En Django, ¿cuál es la diferencia entre los dos siguientes?

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

versus:

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 utilizado ambos enfoques). Los resultados parecen abiertamente similares.

Hassan Baig avatar May 13 '16 16:05 Hassan Baig
Aceptado

El values()método devuelve un QuerySet que contiene diccionarios:

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

El values_list()método devuelve un QuerySet que contiene tuplas:

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

Si está utilizando values_list()un solo campo, puede utilizarlo flat=Truepara devolver un QuerySet de valores únicos en lugar de 1 tupla:

<QuerySet [1, 2]>
Alasdair avatar May 13 '2016 09:05 Alasdair

valores()

Devuelve un QuerySet que devuelve dictionaries, en lugar de instancias de modelo, cuando se utiliza como iterable.

lista_valores()

Devuelve un QuerySet que devuelve list of tuples, en lugar de instancias de modelo, cuando se utiliza como iterable.

distinto()

distintos están acostumbrados a eliminate the duplicatelos elementos.

Ejemplo:

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

>>> list(Article.objects.values('id'))
[{'id':1}, {'id':2}, {'id':3}, {'id':4}, {'id':5}, {'id':6}]
Ibrahim Kasim avatar Dec 11 '2016 10:12 Ibrahim Kasim