詹戈。Q对象动态生成

2024-04-25 06:45:35 发布

您现在位置:Python中文网/ 问答频道 /正文

模型字段有一个过滤器

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(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对象 例如

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'))>]

粘贴到过滤器和使用或分离器


Tags: andtextname模型过滤器fieldfieldssearch
1条回答
网友
1楼 · 发布于 2024-04-25 06:45:35

你能做到的

>>>[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)

相关问题 更多 >