I have a Django model with two custom manager methods. Each object will be based on different attributes of the object
Return different subsets of model objects.
Is there any way to get a query set, or just a list of objects, that is the union of the query sets returned by each manager method?
The solution code is as follows:
q1 = User.objects.filter(id__gte=5) q2 = User.objects.filter(id__lte=9) records = q1| q2
If you don’t want to have duplicate data, you need to add a method:
records = (q1| q2).distinct()
Django version supports union method after 1.11
q = query1.union(query2) # q will contain all unique records of query1 + query2 q = query1.union(query2, all=True) # q will contain all records of query1 + query2 (including duplicate data) q = query1.union(query2,query3) # Union of multiple sets
Merging operations between different models:
q3 = EventVillain.objects.all() q1.union(q3)
This kind of merge may encounter errors, because two different models are merged, they must have the same field or the same subset of fields. Such as:
Hero.objects.all().values_list( "name", "gender").union(Villain.objects.all().values_list( "name", "gender"))
This is to provide names and genders for all Hreo and Villain