Simile alla vecchia Answera, ma un po 'più semplice, senza la lambda:
filter_kwargs = {
'field_a': 123,
'field_b__in': (3, 4, 5, ),
}
Per filtrare queste due condizioni usando OR
:
Item.objects.filter(Q(field_a=123) | Q(field_b__in=(3, 4, 5, ))
Per ottenere lo stesso risultato a livello di codice:
list_of_Q = [Q(**{key: val}) for key, val in filter_kwargs.items()]
Item.objects.filter(reduce(operator.or_, list_of_Q))
(spezzato in due righe qui, per chiarezza)
operator
è nella libreria standard: import operator
da docstring:
oppure_ (a, b) - Come a | b.
Per Python3, reduce
non è più incorporato ma è ancora nella libreria standard:from functools import reduce
PS
Non dimenticare di assicurarti che list_of_Q
non sia vuoto: reduce()
si strozzerà nell'elenco vuoto, ha bisogno di almeno un elemento.
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)