Django的. Q对象动态生成 [英] Django. Q objects dynamicaly generate

查看:379
本文介绍了Django的. Q对象动态生成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有一个用于模型字段的过滤器

There is a filter for the model fields

queryset = queryset.filter(
            Q(title__icontains=search_text) |
            Q(description__icontains=search_text) |
            Q(name_icontains=search_text)
        )

我如何根据情况生成块

Q(title__icontains = search_text)|
Q(description__icontains = search_text)|
Q(name_icontains = search_text)

Q(title__icontains=search_text) |
Q(description__icontains=search_text)|
Q(name_icontains=search_text)

例如,在一种情况下,过滤器必须是这样的

For example, in one case it is necessary that the filter be such

Q(description__icontains = search_text)|
Q(name_icontains = search_text)

Q(description__icontains=search_text) |
Q(name_icontains=search_text)

Q(title__icontains = search_text)|
Q(description__icontains = search_text)|

Q(title__icontains=search_text) |
Q(description__icontains=search_text) |

Q(title__icontains = search_text)

Q(title__icontains=search_text)

我可以使用字典生成Q个对象 例如

I could generate Q objects using a dictionary for example

search_text = 'somthing text'
fields_name = ['title', 'description', 'name']

 queries = [ Q(**{field+'__icontains': search_text}) for field in fields_name]  

但是怎么回事

[<Q: (AND: ('title__icontains': 'first'))>, <Q: (AND: ('description__icontains': 'first'))>, <Q: (AND: ('name__icontains': 'first'))>]

[<Q: (AND: ('title__icontains': 'first'))>, <Q: (AND: ('description__icontains': 'first'))>, <Q: (AND: ('name__icontains': 'first'))>]

粘贴到过滤器中并使用OR分隔符

paste into filter and use OR separator

推荐答案

您可以

>>>[Q(**{field +'__contains': search_text}) for field in fields_name]

现在,如果您想执行OR

>>>import operator
>>>reduce(operator.or_, [Q(**{field+'__contains': search_text}) for field in fields_name])

Q(title__icontains=search_text) |
Q(description__icontains=search_text)|
Q(name_icontains=search_text)

这篇关于Django的. Q对象动态生成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆