Похож на более старый ответ, но немного проще, без лямбды:
filter_kwargs = {
'field_a': 123,
'field_b__in': (3, 4, 5, ),
}
Для фильтрации этих двух условий используется OR
:
Item.objects.filter(Q(field_a=123) | Q(field_b__in=(3, 4, 5, ))
Чтобы получить тот же результат программно:
list_of_Q = [Q(**{key: val}) for key, val in filter_kwargs.items()]
Item.objects.filter(reduce(operator.or_, list_of_Q))
(здесь для удобства разбиты две строки)
operator
находится в стандартной библиотеке: import operator
от docstring:
or_ (a, b) - такой же как a | б.
Для Python3 он reduce
больше не является встроенным, но все еще находится в стандартной библиотеке:from functools import reduce
PS
Не забудьте убедиться, что list_of_Q
он не пустой - reduce()
он захлебнется пустым списком, для этого нужен хотя бы один элемент.
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)