Ähnlich wie bei älteren Answera, aber etwas einfacher, ohne das Lambda:
filter_kwargs = {
'field_a': 123,
'field_b__in': (3, 4, 5, ),
}
So filtern Sie diese beiden Bedingungen mit OR
:
Item.objects.filter(Q(field_a=123) | Q(field_b__in=(3, 4, 5, ))
So erzielen Sie programmgesteuert das gleiche Ergebnis:
list_of_Q = [Q(**{key: val}) for key, val in filter_kwargs.items()]
Item.objects.filter(reduce(operator.or_, list_of_Q))
(aus Gründen der Klarheit in zwei Zeilen unterteilt)
operator
befindet sich in der Standardbibliothek: import operator
Von docstring:
or_ (a, b) - Wie a | b.
Für Python3 reduce
ist es nicht mehr integriert, befindet sich aber immer noch in der Standardbibliothek:from functools import reduce
PS
Vergessen Sie nicht, sicherzustellen, dass list_of_Q
es nicht leer ist - reduce()
wird bei leerer Liste ersticken, es benötigt mindestens ein Element.
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)