I’ve got a Django model with two custom manager methods. Each returns a different subset of the model’s objects, based on a different property of the object.
Is there any way to get a queryset, or just a list of objects, that’s the union of the querysets returned by each manager method?
Use union operator for queryset | to take union of two queryset. If both queryset belongs to same model / single model than it is possible to combine querysets by using union operator. One other way to achieve combine operation between two queryset is to use itertools chain function.
The UNION operator is used to combine the result-set of two or more querysets. The querysets can be from the same or from different models.
This works and looks a bit cleaner:
records = query1 | query2
If you don't want duplicates, then you will need to append .distinct()
:
records = (query1 | query2).distinct()
Starting from version 1.11, django querysets have a builtin union method.
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
See my blog post on this for more examples.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With