Tengo un modelo de Django con dos métodos de administrador personalizados. Cada uno devuelve un subconjunto diferente de los objetos del modelo, según una propiedad diferente del objeto.
¿Hay alguna forma de obtener un conjunto de consultas, o simplemente una lista de objetos, esa es la unión de los conjuntos de consultas devueltos por cada método de administrador?
python
django
django-models
Paul D. Waite
fuente
fuente
Respuestas:
Esto funciona y se ve un poco más limpio:
Si no desea duplicados, deberá agregar
.distinct()
:fuente
ManyToManyField
s. Por ejemplo, a veces verá querecords.count()
será mayor quequery1.count() + query2.count()
, lo cual es claramente incorrecto.QuerySet
clase proporciona métodos__and__
y__or__
que se llaman cuando los operadores&
o|
se usan entre dosQuerySet
objetos (también se usan para laQ
clase ).A partir de la versión 1.11 , los conjuntos de consultas de django tienen un método de unión incorporado.
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 la publicación de mi blog sobre esto para obtener más ejemplos.
fuente
Sugeriría usar 'query1.union (query2)' en lugar de 'query1 | query2 '; Obtuve resultados diferentes de los dos métodos anteriores y el primero es lo que esperaba. Lo siguiente es lo que me encontré:
print "union result:" for element in query_set1.union(query_set2): print element print "| result:" for element in (query_set1 | query_set2): print element
resultado:
fuente