2011-01-28 11 views
13

Tengo un laberinto sinuoso de modelos de Django interrelacionados, con muchos a muchos campos que describen las relaciones.Obtiene todos los objetos relacionados de muchos a muchos de un Django QuerySet

¿Cuál es la forma más limpia de obtener una lista de miembros únicos de un modelo relacionado de un QuerySet?

Si tengo un modelo de artículo con un grupo ManyToMany que apunte al modelo de grupos.

Si tengo un conjunto de consultas de artículos, de artículos '', ¿cómo puedo conseguir esto:

groups = items[0].groups.all().values_list('name', flat=True) 

Pero para todo el conjunto? ¿Debo iterar a través de todos ellos y hacer set(). Intersect()?

Respuesta

17

Una solución es usar 2 consultas.

Puede usar las relaciones inversas para consultar todos los Group que apunta a Item en su items.

groups = groups.objects.filter(item__in=items).distinct().values_list('name', flat=True) 
+0

Suficientemente elegante. Gracias. – samurailawngnome

+2

También puede resultar útil utilizar 'flat = True' como un parámetro para' values_list', que devolverá el resultado como una lista de nombres, en lugar de una lista de tuplas de nombres. – gorus

+0

@gorus - actualizado. Me resulta gracioso eliminar el plano de la publicación original porque lo confundí con distinto. –

Cuestiones relacionadas