Quiero poder enumerar los elementos que un usuario ha agregado (están listados como el creador) o que el elemento ha sido aprobado.
Entonces básicamente necesito seleccionar:
item.creator = owner or item.moderated = False
¿Cómo haría esto en Django? (preferiblemente con un filtro o conjunto de consultas).
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)
reduce(lambda q, f: q | Q(creator=f), filters, Q())
crear el objeto Q grande.Item.objects.filter(creator__in=creators)
, por ejemplo.|
proviene el uso como operador OR, en realidad es el operador de unión establecida. También se usa (no aquí) como bit a bit O: stackoverflow.com/questions/5988665/pipe-character-in-pythonPuedes usar el | operador para combinar conjuntos de consultas directamente sin necesidad de objetos Q:
(editar: inicialmente no estaba seguro de si esto causaba una consulta adicional, pero @spookylukey señaló que la evaluación de conjunto de consultas perezoso se encarga de eso)
fuente
Vale la pena señalar que es posible agregar expresiones Q.
Por ejemplo:
Esto termina con una consulta como:
De esta manera no hay necesidad de tratar o operadores, reducir de etc.
fuente
query |= Q(email='[email protected]')
?Si desea hacer que el filtro sea dinámico, debe usar Lambda como
reduce(lambda x, y: x | y, [Q(brand=item) for item in brands])
es equivalente afuente
from functools import reduce
antemano.operator.or_
lugar delambda x, y: x | y
?Similar a la answera anterior, pero un poco más simple, sin la lambda:
Para filtrar estas dos condiciones usando
OR
:Para obtener el mismo resultado mediante programación:
(dividido en dos líneas aquí, para mayor claridad)
operator
está en la biblioteca estándar:import operator
desde docstring:
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.fuente
Esto podría ser útil https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships
Básicamente parece que actúan como OR
fuente