2010-03-17 27 views
61

Me cuesta entender cómo funciona el ORM de Django. Lo que quiero hacer es obtener una lista de valores distintos dentro de un campo en mi mesa .... el equivalente de uno de los siguientes:Seleccionar valores distintos de un campo de tabla

SELECT DISTINCT myfieldname FROM mytable 

(o alternativamente)

SELECT myfieldname FROM mytable GROUP BY myfieldname 

I' Al menos, me gusta hacerlo de la manera Django antes de recurrir a sql en bruto. Por ejemplo, con una tabla:

Identificación, calle, ciudad

1, Main Street, Hull

2, otra calle, Hull

3, Bibble Way, Leicester

4, Otra forma, Leicester

5, High Street, Londidium

me gustaría llegar:

Hull, Leicester, Londidium.

Respuesta

128

Digamos que su modelo es 'Comprar'

class Shop(models.Model): 
    street = models.CharField(max_length=150) 
    city = models.CharField(max_length=150) 

    # some of your models may have explicit ordering 
    class Meta: 
     ordering = ('city') 

Dado que es posible que tenga establecido el atributo orderingMeta clase, puede utilizar order_by() sin parámetros para despejar cualquier ordenación cuando se utiliza distinct(). Consulte la documentación bajo order_by()

Si no desea que cualquier ordenación que se aplicará a una pregunta, ni siquiera el orden predeterminado, llame order_by() sin parámetros.

y distinct() en la nota donde se describen problemas con el uso de distinct() con el pedido.

Para consultar su base de datos, sólo hay que llamar:

models.Shop.objects.order_by().values('city').distinct() # returns a dictionary 

o

models.Shop.objects.order_by().values_list('city').distinct() # returns a list of tuples. 

También puede agregar a flat=Truevalues_list tener una lista plana.

Véase también: Get distinct values of Queryset by field

+25

Actualmente funciona. ¡Sin embargo! No pude hacer que funcione en todos mis modelos. Weidly, funcionó en algunos, pero no en otros. Para aquellos que tienen un pedido de Meta, no funciona. Por lo tanto, primero debe borrar el orden en el conjunto de preguntas. models.Shop.objects.order_by(). Values ​​('city'). Distinct() – alj

+1

Es importante tener en cuenta que 'values_list' en realidad no devuelve una lista. Devuelve algo así como un conjunto de preguntas.Me pareció útil usar siempre list() alrededor de llamadas a values_list. – dheerosaur

+8

'values_list' devuelve ValuesListQuerySet que es un iterador. Enviar 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. –

Cuestiones relacionadas