Mam model Django z dwoma niestandardowymi metodami menedżera. Każda zwraca inny podzbiór obiektów modelu w oparciu o inną właściwość obiektu.
Czy istnieje sposób, aby uzyskać zestaw zapytań, czy tylko listę obiektów, czyli sumę zestawów zapytań zwróconych przez każdą metodę menedżera?
python
django
django-models
Paul D. Waite
źródło
źródło
Odpowiedzi:
To działa i wygląda trochę czyściej:
Jeśli nie chcesz duplikatów, musisz dołączyć
.distinct()
:źródło
ManyToManyField
s. Na przykład czasami zobaczysz, żerecords.count()
będzie większe niżquery1.count() + query2.count()
, co jest wyraźnie niepoprawne.QuerySet
klasa udostępnia metody__and__
i__or__
które nazywane są po&
lub|
operatorzy są wykorzystywane między dwomaQuerySet
przedmiotami (także stosowanych doQ
klasy, jak również ).Począwszy od wersji 1.11 , zestawy zapytań django mają wbudowaną metodę unii.
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
Więcej przykładów znajdziesz w moim wpisie na blogu .
źródło
Sugerowałbym użycie „query1.union (query2)” zamiast „query1 | zapytanie2 '; Otrzymałem różne wyniki z powyższych dwóch metod, a pierwsza jest tym, czego się spodziewałem. Oto, co spotkałem:
print "union result:" for element in query_set1.union(query_set2): print element print "| result:" for element in (query_set1 | query_set2): print element
wynik:
źródło