Tengo curiosidad por saber si hay alguna forma de hacer una consulta en Django que no sea " SELECT * FROM...
" debajo. Estoy tratando de hacer un " SELECT DISTINCT columnName FROM ...
" en su lugar.
Específicamente tengo un modelo que se parece a:
class ProductOrder(models.Model):
Product = models.CharField(max_length=20, promary_key=True)
Category = models.CharField(max_length=30)
Rank = models.IntegerField()
donde Rank
es un rango dentro de a Category
. Me gustaría poder iterar sobre todas las categorías haciendo alguna operación en cada rango dentro de esa categoría.
Primero me gustaría obtener una lista de todas las categorías en el sistema y luego consultar todos los productos en esa categoría y repetir hasta que se procese cada categoría.
Prefiero evitar SQL sin formato, pero si tengo que ir allí, estaría bien. Aunque nunca antes había codificado SQL sin formato en Django / Python.
En realidad, es bastante simple si está usando PostgreSQL , solo use
distinct(columns)
( documentación ).Tenga en cuenta que esta función se ha incluido en Django desde 1.4
fuente
can_distinct_on_fields
que parece ser solo de Postgresall()
no es necesario aquíLas otras respuestas están bien, pero esto es un poco más limpio, ya que solo proporciona los valores que obtendría de una consulta DISTINCT, sin ningún cruft de Django.
o
Y funciona sin PostgreSQL.
Esto es menos eficiente que usar un .distinct (), asumiendo que DISTINCT en su base de datos es más rápido que un python
set
, pero es genial para moverse por el shell.fuente
values_list
no colocaDISTINCT
en la consulta sql, por lo que esto traería múltiples valores si los hubiera.El usuario ordena con ese campo y luego lo hace distinto.
fuente