Есть фильтр по полям модели:
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]
Но как потом это:
[
Через OR засунуть в filter - не могу никак разобраться. Прошу помощи.
Ответ
query = Q()
for q in queries:
query |= q
или
import operator
query = reduce(operator.or_, queries)
Комментариев нет:
Отправить комментарий