similares a answera mayor, 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 utilizando 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))
(roto en dos líneas aquí, para mayor claridad)
operator
está en la biblioteca estándar: import operator
De docstring:
or_ (a, b) - Igual que a | segundo.
Para python3, reducir no está en la biblioteca estándar: from functools import reduce
P. S.
No olvide asegurarse de que list_of_Q
no esté vacío - reduce()
se ahogará en la lista vacía, necesita al menos un elemento.
cómo ¿Podría hacerse esto programáticamente? Entonces, por ejemplo, puede tener filtros 'for f in: Item.objects.filter (Q (creador = f1) | Q (creador = f2) | ...)' – Alexis
@AlexisK Use algo como 'reduce (lambda q , f: q | Q (creador = f), filtros, Q()) 'para crear el objeto Q grande. – Phob
@alexis: también podría hacer 'Item.objects.filter (creator__in = creators)', por ejemplo. –