Je veux pouvoir répertorier les éléments ajoutés par un utilisateur (ils sont répertoriés en tant que créateur) ou l'élément a été approuvé.
J'ai donc essentiellement besoin de sélectionner:
item.creator = owner or item.moderated = False
Comment pourrais-je faire cela dans Django? (de préférence avec un filtre ou un ensemble de requêtes).
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)
reduce(lambda q, f: q | Q(creator=f), filters, Q())
pour créer le grand objet Q.Item.objects.filter(creator__in=creators)
, par exemple.|
vient l'utilisation de l'opérateur OR, c'est en fait l'opérateur union défini. Il est également utilisé (pas ici) au niveau du bit OU: stackoverflow.com/questions/5988665/pipe-character-in-pythonVous pouvez utiliser le | pour combiner directement des ensembles de requêtes sans avoir besoin d'objets Q:
(modifier - J'étais initialement incertain si cela provoquait une requête supplémentaire, mais @spookylukey a souligné que l'évaluation paresseuse du jeu de requêtes s'en occupait)
la source
Il convient de noter qu'il est possible d'ajouter des expressions Q.
Par exemple:
Cela se termine par une requête comme:
De cette façon, il n'est pas nécessaire de traiter avec ou les opérateurs, de réduire etc.
la source
query |= Q(email='[email protected]')
?Vous voulez rendre le filtre dynamique, alors vous devez utiliser Lambda comme
reduce(lambda x, y: x | y, [Q(brand=item) for item in brands])
est équivalent àla source
from functools import reduce
au préalable.operator.or_
place delambda x, y: x | y
?Semblable aux anciens répondeurs, mais un peu plus simple, sans le lambda:
Pour filtrer ces deux conditions à l'aide de
OR
:Pour obtenir le même résultat par programme:
(cassé en deux lignes ici, pour plus de clarté)
operator
est dans la bibliothèque standard:import operator
De docstring:
Pour Python3,
reduce
n'est plus une fonction intégrée mais est toujours dans la bibliothèque standard:from functools import reduce
PS
N'oubliez pas de vous assurer qu'il
list_of_Q
n'est pas vide -reduce()
s'étouffera sur la liste vide, il a besoin d'au moins un élément.la source
Cela peut être utile https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships
Fondamentalement, il semble qu'ils agissent comme OU
la source