2つのカスタムマネージャーメソッドを備えたDjangoモデルがあります。それぞれが、オブジェクトの異なるプロパティに基づいて、モデルのオブジェクトの異なるサブセットを返します。
各マネージャーメソッドによって返されるクエリセットの和集合であるクエリセット、またはオブジェクトのリストを取得する方法はありますか?
2つのカスタムマネージャーメソッドを備えたDjangoモデルがあります。それぞれが、オブジェクトの異なるプロパティに基づいて、モデルのオブジェクトの異なるサブセットを返します。
各マネージャーメソッドによって返されるクエリセットの和集合であるクエリセット、またはオブジェクトのリストを取得する方法はありますか?
回答:
これは機能し、少しきれいに見えます:
records = query1 | query2
重複したくない場合は、以下を追加する必要があります.distinct()
。
records = (query1 | query2).distinct()
ManyToManyField
sを処理するときに誤った結果を返すことがあります。たとえば、それがrecords.count()
より大きい場合がありますがquery1.count() + query2.count()
、これは明らかに正しくありません。
QuerySet
クラスのための方法を提供__and__
し、__or__
呼ばれたときに&
、または|
オペレータが2つの間で使用され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 |の代わりに' query1.union(query2) 'を使用することをお勧めします。query2 '; 上記の2つの方法とは異なる結果が得られましたが、前者は期待どおりでした。以下は私が出くわしたものです:
print "union result:"
for element in query_set1.union(query_set2):
print element
print "| result:"
for element in (query_set1 | query_set2):
print element
結果:
union result:
KafkaTopic object
KafkaTopic object
KafkaTopic object
KafkaTopic object
KafkaTopic object
| result:
KafkaTopic object
KafkaTopic object