Saya punya model Django dengan dua metode manajer ubahsuaian. Masing-masing mengembalikan subset objek model yang berbeda, berdasarkan properti objek yang berbeda.
Apakah ada cara untuk mendapatkan queryset, atau hanya daftar objek, yang merupakan gabungan dari queryset yang dikembalikan oleh setiap metode manajer?
python
django
django-models
Paul D. Waite
sumber
sumber
Jawaban:
Ini berfungsi dan terlihat sedikit lebih bersih:
Jika Anda tidak ingin duplikat, maka Anda perlu menambahkan
.distinct()
:sumber
ManyToManyField
s. Misalnya, terkadang Anda akan melihat bahwarecords.count()
akan lebih besar dariquery1.count() + query2.count()
, yang jelas tidak benar.QuerySet
kelas menyediakan metode untuk__and__
dan__or__
yang dipanggil saat&
atau|
operator yang digunakan antara duaQuerySet
benda (juga digunakan untukQ
kelas juga ).Mulai dari versi 1.11 , querysets django memiliki metode penyatuan bawaan.
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
Lihat posting blog saya tentang ini untuk lebih banyak contoh.
sumber
Saya akan menyarankan menggunakan 'query1.union (query2)' daripada 'query1 | query2 '; Saya mendapatkan hasil yang berbeda dari dua metode di atas dan yang pertama adalah yang saya harapkan. Berikut ini adalah apa yang saya temui:
print "union result:" for element in query_set1.union(query_set2): print element print "| result:" for element in (query_set1 | query_set2): print element
hasil:
sumber