Estoy luchando para entender el ORM de Django. Lo que quiero hacer es obtener una lista de valores distintos dentro de un campo en mi tabla ... el equivalente a uno de los siguientes:
SELECT DISTINCT myfieldname FROM mytable
(o alternativamente)
SELECT myfieldname FROM mytable GROUP BY myfieldname
Al menos me gustaría hacerlo a la manera de Django antes de recurrir a sql sin procesar. Por ejemplo, con una mesa:
id, calle, ciudad
1, calle principal, casco
2, otra calle, casco
3, Bibble Way, Leicester
4, de otra manera, Leicester
Calle principal 5, Londidium
Me gustaría conseguir:
Hull, Leicester, Londidium.
values_list
realidad no devuelve una lista. Devuelve algo así como un conjunto de consultas. Me pareció útil usar siempre list () alrededor de las llamadas de values_list.values_list
devuelve ValuesListQuerySet, que es un iterador. La conversión a la lista puede ser útil, pero también puede afectar el rendimiento cuando todas las filas deben evaluarse a la vez, especialmente con grandes conjuntos de datos.Meta: ordering = ()
"característica" de django orm yobjects.distinct()
vs.objects.ordering().distinct()
nos causó horas de confusión. Debe haber una calcomanía de advertencia de seguridad para el consumidor en ese producto;) Podemos instituir una política de atributos de no-meta-pedido para evitar que se rasque la cabeza en el futuro.Meta
claseordering
y resolver problemasdistinct
utilizandoorder_by()
sin parámetros. Está en los documentos de la API de QuerySet enorder_by()
" Si no desea que se aplique ningún orden a una consulta, ni siquiera el orden predeterminado, llameorder_by()
sin parámetros " .Además de la todavía muy relevante respuesta de jujule , me parece muy importante también tener en cuenta las implicaciones de
order_by()
endistinct("field_name")
consultas. Sin embargo, esta es una característica exclusiva de Postgres.Si está utilizando Postgres y define un nombre de campo para el que la consulta debe ser distinta, entonces
order_by()
debe comenzar con el mismo nombre de campo (o nombres de campo) en la misma secuencia (puede haber más campos después).Si desea, por ejemplo, extraer una lista de ciudades en las que sabe tiendas, el ejemplo de jujule debería adaptarse a esto:
fuente
Por ejemplo:
fuente