1

私は興味深いDjangoの問題を抱えています。

次の点を考慮してください。

Model.objects.filter(Q(id='test1') and Q(id='test2'))

これは期待される結果を返しますが、

Model.objects.filter(Q(id='test1') & Q(id='test2'))

ではない!!

何が起きてる?

4

3 に答える 3

4

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)
    ...
于 2013-10-25T01:47:42.987 に答える
0

私はあなたが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
于 2013-10-25T04:02:39.523 に答える