私は興味深いDjangoの問題を抱えています。
次の点を考慮してください。
Model.objects.filter(Q(id='test1') and Q(id='test2'))
これは期待される結果を返しますが、
Model.objects.filter(Q(id='test1') & Q(id='test2'))
ではない!!
何が起きてる?
私は興味深いDjangoの問題を抱えています。
次の点を考慮してください。
Model.objects.filter(Q(id='test1') and Q(id='test2'))
これは期待される結果を返しますが、
Model.objects.filter(Q(id='test1') & Q(id='test2'))
ではない!!
何が起きてる?
Django ORM に test1 と test2 を返すようにするには、次を使用する必要があります。
Model.objects.filter(Q(id='test1') | Q(id='test2'))
Model.objects.filter(Q(id='test1') & Q(id='test2'))
ID が test1 であると同時に test2 であるモデル オブジェクトを返すことを意味します。もちろん、django は空の QuerySet を返します。
andはPythonのブール演算子です。操作x and y
の結果はif x is false, then x, else y
です。したがってQ(id='test1') and Q(id='test2')
に等しいQ(id='test1')
、それはあなたが望むものではありません。
&/| ビットごとのand/or 演算子です。
ところで、ブール演算子をオーバーライドする方法はありませんが、/&/|
という名前のメソッドを定義することで、クラス内の演算子をオーバーライドできます。__and__
__or__
以下は、django Q オブジェクト[github]のソース コードです。
class Q(tree.Node):
"""
Encapsulates filters as objects that can then be combined logically (using
& and |).
"""
# Connection types
AND = 'AND'
OR = 'OR'
default = AND
def __or__(self, other):
return self._combine(other, self.OR)
def __and__(self, other):
return self._combine(other, self.AND)
...
私はあなたがOR
ここに欲しいと思います、そしてそうではありませんAND
filters = ['test1', 'test2', 'test3', 'test4']
filtered = Model.objects.filter(Q(id = filters[0]))
for f in filters[1:]:
subset = Model.objects.filter(Q(id = f))
filtered = filtered | subset