Chcę mieć możliwość wyświetlenia elementów, które albo użytkownik dodał (są wymienione jako twórcy), albo element został zatwierdzony.
Zasadniczo muszę wybrać:
item.creator = owner or item.moderated = False
Jak mam to zrobić w Django? (najlepiej z filtrem lub zestawem zapytań).
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)
reduce(lambda q, f: q | Q(creator=f), filters, Q())
aby utworzyć duży obiekt Q.Item.objects.filter(creator__in=creators)
na przykład.|
bierze się operator OR, to tak naprawdę jest to ustawiony operator unii. Jest również używany (nie tutaj) jako bitowe LUB: stackoverflow.com/questions/5988665/pipe-character-in-pythonMożesz użyć | operator do bezpośredniego łączenia zestawów zapytań bez potrzeby korzystania z obiektów Q:
(edytuj - początkowo nie byłem pewien, czy to spowodowało dodatkowe zapytanie, ale @spookylukey wskazał, że zajmuje się tym leniwa ocena zestawu zapytań)
źródło
Warto zauważyć, że można dodać wyrażenia Q.
Na przykład:
To kończy się zapytaniem takim jak:
W ten sposób nie ma potrzeby zajmować się lub operatorów, zmniejszenie'S etc.
źródło
query |= Q(email='[email protected]')
?Chcesz, aby filtr był dynamiczny, a następnie musisz użyć Lambda jak
reduce(lambda x, y: x | y, [Q(brand=item) for item in brands])
jest równaźródło
from functools import reduce
wcześniej.operator.or_
zamiastlambda x, y: x | y
?Podobne do starszych odpowiedzi, ale nieco prostsze, bez lambda:
Aby odfiltrować te dwa warunki za pomocą
OR
:Aby uzyskać ten sam wynik programowo:
(podzielone na dwie linie tutaj dla jasności)
operator
znajduje się w standardowej bibliotece:import operator
Od docstring:
W przypadku Python3
reduce
nie jest już wbudowany, ale nadal znajduje się w standardowej bibliotece:from functools import reduce
PS
Nie zapomnij upewnić się, że
list_of_Q
nie jest pusty -reduce()
zadławi się na pustej liście, potrzebuje co najmniej jednego elementu.źródło
Może to być przydatne https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships
Zasadniczo wygląda na to, że działają jak OR
źródło