模型字段有一个过滤器
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'))>]
粘贴到过滤器并使用OR分隔符
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) )How i can do generate block according to circumstances
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)
or
Q(title__icontains=search_text) | Q(description__icontains=search_text) |
or
Q(title__icontains=search_text)
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]but how this
[<Q: (AND: ('title__icontains': 'first'))>, <Q: (AND: ('description__icontains': 'first'))>, <Q: (AND: ('name__icontains': 'first'))>]
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)You can do
>>>[Q(**{field +'__contains': search_text}) for field in fields_name]Now if you want to do an OR
>>>import operator >>>reduce(operator.or_, [Q(**{field+'__contains': search_text}) for field in fields_name])Which is the same as
Q(title__icontains=search_text) | Q(description__icontains=search_text)| Q(name_icontains=search_text)更多推荐
发布评论