Quero poder listar os itens que um usuário adicionou (eles são listados como criador) ou o item foi aprovado.
Então, eu basicamente preciso selecionar:
item.creator = owner or item.moderated = False
Como eu faria isso no Django? (de preferência com um filtro ou 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())
para criar o grande objeto Q.Item.objects.filter(creator__in=creators)
, por exemplo.|
vem sendo usado como operador OR, na verdade é o operador de união definida. Também é usado (não aqui) como bit a bit OU: stackoverflow.com/questions/5988665/pipe-character-in-pythonVocê pode usar o | operador para combinar conjuntos de consultas diretamente sem a necessidade de objetos Q:
(editar - eu inicialmente não tinha certeza se isso causava uma consulta extra, mas @spookylukey apontou que a avaliação lenta do conjunto de consultas cuida disso)
fonte
Vale ressaltar que é possível adicionar expressões Q.
Por exemplo:
Isso acaba com uma consulta como:
Desta forma, não há necessidade de lidar com ou operadores, reduzir etc.
fonte
query |= Q(email='[email protected]')
?Você quer dinamizar o filtro, então precisa usar o Lambda como
reduce(lambda x, y: x | y, [Q(brand=item) for item in brands])
é equivalente afonte
from functools import reduce
antes.operator.or_
vez delambda x, y: x | y
?Semelhante à resposta anterior, mas um pouco mais simples, sem o lambda:
Para filtrar essas duas condições usando
OR
:Para obter o mesmo resultado programaticamente:
(dividido em duas linhas aqui, para maior clareza)
operator
está na biblioteca padrão:import operator
De docstring:
Para Python3,
reduce
não é mais um built-in, mas ainda está na biblioteca padrão:from functools import reduce
PS
Não se esqueça de certificar-
list_of_Q
se de que não está vazio -reduce()
irá sufocar na lista vazia, ele precisa de pelo menos um elemento.fonte
Isso pode ser útil https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships
Basicamente, parece que eles agem como OR
fonte