2010-12-10 14 views
50

İki özel yönetici yöntemine sahip bir Django modelim var. Her biri, nesnenin farklı bir özelliğine dayanarak modelin nesnelerinin farklı bir alt kümesini döndürür.İki Django querysets birliğini nasıl bulabilirim?

Her bir yönetici yönteminin döndürdüğü querysetlerin birleşimi olan bir queryset veya yalnızca nesne listesi almanın bir yolu var mı?

+2

(Silinmiş bir yanıttan) Farklı Modellerden QuerySets ile çalışan bir varyasyon için bu soruya bakın: http://stackoverflow.com/questions/431628/how-to-combine-2-or-more-querysets-in -a-django-view – rnevius

+1

Sürüm 1.11'den başlayarak django sorgu kümelerinin yerleşik bir birleşim yöntemi vardır. Ben gelecekteki referans için bir yanıt olarak ekledim –

cevap

127

Bu çalışır ve biraz daha temiz görünür: Eğer çiftleri istemiyorsanız

records = query1 | query2 

, o zaman .distinct() eklemek gerekir:

records = (query1 | query2).distinct() 
+4

Kabul edilen yanıt bir yinelenen yinelenen (tam olarak), OP sordu gibi döndürürken, bu yöntem gerçek bir querysets birleşimi döndürür. Bu queryset, pek çok durumda istenen daha fazla çalıştırılabilir. –

+4

Bir Django hatası nedeniyle, bu yapım bazen 'ManyToManyField's ile çalışırken yanlış sonuçlar verebilir. Örneğin, bazen records.count() işlevinin 'query1.count() + query2.count()' dan daha büyük olacağını ve bunun açıkça yanlış olduğunu görürsünüz. – Jian

+4

@Jian, django versiyonunu hatayla ve djangoproject konusuna giden bir bağlantıyla netleştirebilir misiniz? – IMFletcher

16

version 1.11 itibaren django Sorgu kümelerini bir var yerleşik sendika yöntemi.

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 

Bu konuda daha fazla örnek için blog post sayfama bakın.

İlgili konular