Similar a la answera anterior, pero un poco más simple, sin la lambda:
filter_kwargs = {
'field_a': 123,
'field_b__in': (3, 4, 5, ),
}
Para filtrar estas dos condiciones usando OR
:
Item.objects.filter(Q(field_a=123) | Q(field_b__in=(3, 4, 5, ))
Para obtener el mismo resultado mediante programación:
list_of_Q = [Q(**{key: val}) for key, val in filter_kwargs.items()]
Item.objects.filter(reduce(operator.or_, list_of_Q))
(dividido en dos líneas aquí, para mayor claridad)
operator
está en la biblioteca estándar: import operator
desde docstring:
o_ (a, b): igual que a | si.
Para Python3, reduce
ya no está integrado, pero todavía está en la biblioteca estándar:from functools import reduce
PD
No olvides asegurarte de list_of_Q
que no esté vacío: reduce()
se ahogará en la lista vacía, necesita al menos un elemento.
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)