У меня есть модель Django с двумя настраиваемыми методами диспетчера. Каждый возвращает различное подмножество объектов модели, основанное на различных свойствах объекта.
Есть ли способ получить набор запросов или просто список объектов, представляющий собой объединение наборов запросов, возвращаемых каждым методом менеджера?
python
django
django-models
Пол Д. Уэйт
источник
источник
Ответы:
Это работает и выглядит немного чище:
Если вам не нужны дубликаты, вам нужно будет добавить
.distinct()
:источник
ManyToManyField
s. Например, иногда вы видите, чтоrecords.count()
это будет большеquery1.count() + query2.count()
, что явно неверно.QuerySet
класс предоставляет методы__and__
и__or__
которые вызываются , когда&
или|
используются операторы между двумяQuerySet
объектами (также используются дляQ
класса , а также ).Начиная с версии 1.11 , наборы запросов django имеют встроенный метод объединения.
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
Дополнительные примеры см. В моем сообщении в блоге .
источник
Я бы посоветовал использовать query1.union (query2) вместо query1 | query2 '; Я получил разные результаты от двух вышеупомянутых методов, и первый - то, что я ожидал. Вот что я обнаружил:
print "union result:" for element in query_set1.union(query_set2): print element print "| result:" for element in (query_set1 | query_set2): print element
результат:
источник