django Q对象(使用OR连接类型一次创建)

dxxyhpgq  于 2023-01-22  发布在  Go
关注(0)|答案(3)|浏览(116)

强哥1.10.1

from django.db.models import Q
q = Q(title__icontains='r')

print(q)
>>> (AND: ('title__icontains', 'r'))

我只是想是否有可能创建相同的,但与或逻辑运算.
我可以获得OR如下:

for item in q_objects:
    query |= item

或者以其他方式(使用lamba)。
但是我感觉不到这个Q物体,这个问题可以帮助我更好地理解它。
换句话说,是否可以通过构造函数创建一个对象,该对象将显示(或:('标题__图标','r'))?

41zrol4v

41zrol4v1#

我最近发现了这一点,我的解决方案是:

filter_params = Q(
        **{key: value for key, value in filter_params_dict.items()},
        _connector=Q.OR,
    )

return Model.objects.filter(filter_params)
mwg9r5ms

mwg9r5ms2#

黑客:

>>> Q.default = Q.OR
>>> q = Q(title__icontains='r')
>>> q
<Q: (OR: ('title__icontains', 'r'))>

不要这样做,因为您已经为任何将来(和现有!)的用户改变了Q类。
更礼貌:

from django.db.models import Q

class MyQ(Q):
    default = Q.OR

q = MyQ(title__icontains='r')

但是现在你有了Q子类的一个示例,这不应该是一个问题,但是对于这些简单的对象来说,这实际上是不必要的,下面是一个更高级的方法:

>>> from django.db.models import Q
>>> q = Q.__new__(Q)
>>> q.default = Q.OR
>>> q.__init__(title__icontains='r')
>>> q
<Q: (OR: ('title__icontains', 'r'))>
>>> Q.default  # existing Q instances are unaffected
u'AND'
kfgdxczn

kfgdxczn3#

@wim的回答太赞了!只是一点补充:
为Q创建一个新对象似乎失败了,但是您可以使用Q.default = Q.OR修改默认连接器。
此外,还可以通过执行以下操作一次传递所有查询参数:

Model.objects.filter(Q(**query_dict))
 # Make sure to use query dictionary taking note of the fact that simply using
 # Double star operator would produce list values. You can do:
 dictionary = dict(query_dict)
 well_formed = {key: dictionary.get(key)[0] for key in dictionary.keys()}
 result = Model.objects.filter(Q(**query_dict))

相关问题