122 votes

Comment composer dynamiquement un OU filtre de requête dans Django?

À partir d'un exemple, vous pouvez voir un multiple OU un filtre de requête:

L'Article.objets.filtre(Q(pk=1) | Q(pk=2) | Q(pk=3))

Par exemple, il en résulte:

[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]

Cependant, je veux créer ce filtre de requête à partir d'une liste. Comment faire?

par exemple [1, 2, 3] -> Article.objets.filtre(Q(pk=1) | Q(pk=2) | Q(pk=3))

190voto

Dave Webb Points 90034

Vous pourriez chaîne de vos requêtes comme suit:

values = [1,2,3]

# Turn list of values into list of Q objects
queries = [Q(pk=value) for value in values]

# Take one Q object from the list
query = queries.pop()

# Or the Q object with the ones remaining in the list
for item in queries:
    query |= item

# Query the model
Article.objects.filter(query)

48voto

Tom Viner Points 2323

Un moyen plus court de l'écriture Dave Webb réponse à l'aide de python de la fonction de réduction:

values = [1,2,3]

# Turn list of values into one big Q objects  
query = reduce(lambda q,value: q|Q(pk=value), values, Q())  

# Query the model  
Article.objects.filter(query)

43voto

values = [1, 2, 3]
query = reduce(operator.or_, (Q(pk=x) for x in values))

24voto

alex vasi Points 2893

C'est peut-être préférable d'utiliser sql DANS l'énoncé.

Article.objects.filter(id__in=[1, 2, 3])

Voir queryset de référence de l'api.

Si vous avez vraiment besoin de faire des requêtes avec une logique dynamique, vous pouvez faire quelque chose comme ceci (laid + pas testé):

query = Q(field=1)
for cond in (2, 3):
    query = query | Q(field=cond)
Article.objects.filter(query)

10voto

Dominic Rodger Points 44489

Voir les docs:

>>> Blog.objects.in_bulk([1])
{1: <Blog: Beatles Blog>}
>>> Blog.objects.in_bulk([1, 2])
{1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>}
>>> Blog.objects.in_bulk([])
{}

Notez que cette méthode ne fonctionne que pour la clé primaire de recherches, mais qui semble être ce que vous essayez de faire.

Donc, ce que vous voulez, c'est:

Article.objects.in_bulk([1, 2, 3])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X