2012-06-01 29 views
38

trato de obtener una lista de claves externas distintas y escribí esto:Django Modelo - Obtener lista de valores distinta

my_ids = Entity.objects.values('foreign_key').distinct() 

Pero consigo sólo una lista de claves externas UNDISTINCT ... ¿Qué me falta?

Gracias!

Respuesta

28

¡Eso es para la pista! Ambas soluciones no trabajarán 100% ... pero yo tipo de ellos :)

combinan Al pasar un argumento para no funciona distinto para MySQL-bases de datos (que yo sepa)

Esta funciona y devuelve un solo objeto:

Entity.objects.order_by('foreign_key').values('foreign_key').distinct()

Pero gracias de todos modos :)

+4

Tengo el mismo problema en una base de datos Postgres9.1, Django == 1.5.5. Añadiendo order_by help - stupid ... – kev

31

Tal vez es posible que desee ir con esto:

Entity.objects.order_by().values_list('foreign_key', flat=True).distinct() 
+7

MAL. No funcionará cuando se use sin order_by ('foregin_key'). Por ejemplo, en M2M (postgres, django 1.8) – andi

3
Entity.objects.order_by('foreign_key').distinct('foreign_key') 

Si ya los tiene como una lista, y luego convertirlo a un set() para obtener los valores distintos.

+0

no es esta conversión para establecer una idea costosa con respecto a la memoria, ya que con set() todo se rellenará en la memoria donde el queryset no se cargará hasta que se evalúe ... y esta conversión a ¿La cosa de la lista evaluará el queryset también? –

15
Entity.objects.values_list('foreign_key', flat=True).distinct().order_by() 

distinta no funcionar con el fin por

Cualquier campo utilizado en una llamada order_by() se incluye en las columnas SQL SELECT . Esto a veces puede conducir a resultados inesperados cuando se usa en junto con distinct(). Si ordena por campos de un modelo relacionado , esos campos se agregarán a las columnas seleccionadas y pueden hacer que las filas duplicadas aparezcan como distintas. Como las columnas adicionales no aparecen en los resultados devueltos (solo están disponibles para pedidos de soporte ), a veces parece que se devuelven resultados no nulos en .

Del mismo modo, si se utiliza un archivo de valores() consulta para restringir las columnas seleccionado, todavía estarán involucradas las columnas utilizadas en cualquier order_by() (o por defecto modelo pedidos) y puede afectar a la singularidad de los resultados.

La moraleja es que si usa distinct() tenga cuidado con ordenando por modelos relacionados. Del mismo modo, al usar distinct() y values ​​() juntos, tenga cuidado al ordenar por campos que no están en la llamada values ​​().

https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct

+0

¿Podría elaborar un poco más? dada la tasa de votación de esta pregunta, este es un problema para muchas personas.¿Cuál es tu fuente para decir eso? –

+0

casi pierdo la cabeza. gracias por esta solución! – Crystal

Cuestiones relacionadas