2010-12-10 6 views
50

Tengo un modelo de Django con dos métodos de administrador personalizados. Cada uno devuelve un subconjunto diferente de los objetos del modelo, en función de una propiedad diferente del objeto.¿Cómo puedo encontrar la unión de dos conjuntos de consulta Django?

¿Hay alguna manera de obtener un conjunto de consulta, o simplemente una lista de objetos, esa es la unión de los conjuntos de consulta devueltos por cada método de administrador?

+2

(De una respuesta eliminada) Consulte esta pregunta para ver una variación que funciona con QuerySets de diferentes modelos: http://stackoverflow.com/questions/431628/how-to-combine-2-or-more-querysets-in -a-django-view – rnevius

+1

A partir de la versión 1.11, los conjuntos de consultas django tienen un método de unión integrado. Lo he agregado como respuesta para referencia futura –

Respuesta

127

Esto funciona y se ve un poco más limpia:

records = query1 | query2 

Si no desea duplicados, entonces necesitará para anexar .distinct():

records = (query1 | query2).distinct() 
+4

Mientras que la respuesta aceptada devuelve una unión iterable (lista para ser exacta), como OP ha pedido, este método devuelve una verdadera unión de conjuntos de consulta. Este conjunto de consulta puede ser operado más allá, lo que se desea en muchas circunstancias. –

+4

Debido a un error de Django, esta construcción a veces puede devolver resultados incorrectos cuando se trata de 'ManyToManyField's. Por ejemplo, a veces verá que 'records.count()' será mayor que 'query1.count() + query2.count()', lo cual es claramente incorrecto. – Jian

+4

@Jian ¿puedes aclarar la versión de django con el error y un enlace al problema djangoproject? – IMFletcher

16

A partir de version 1.11, QuerySets django tienen una método de unión interna.

q = q1.union(q2) #q will contain all unique records of q1 + q2 
q = q1.union(q2, all=True) #q will contain all records of q1 + q2 including duplicates 
q = q1.union(q2,q3) # more than 2 queryset union 

Vea mi blog post en esto para más ejemplos.

Cuestiones relacionadas