Je dois exécuter une requête Django qui vérifie si un champ contient toutes les valeurs d'une liste. La liste sera de longueur variable
Exemple
User.objects.filter(first_name__contains=['x','y','z'])
reduce(operator.and_, (Q(first_name__contains=x) for x in ['x', 'y', 'z']))
import operator
from Django.db.models import Q
q = ['x', 'y', 'z']
query = reduce(operator.and_, (Q(first_name__contains = item) for item in ['x', 'y', 'z']))
result = User.objects.filter(query)
Juste une autre approche.
qs = User.objects.all()
for search_term in ['x', 'y', 'z']:
qs = qs.filter(first_name__contains=search_term)
Je ne suis pas sûr que ce soit mieux, mais c'est plus lisible.
from Django.db.models import Q
User.objects.filter(Q(first_name__contains=x)&Q(first_name__contains=y)&Q(first_name__contains=z))
Fonctionne pour moi sur Django 1.8 Python 2.7
doc => https://docs.djangoproject.com/fr/1.8/ref/models/querysets/#q-objects
pour les plus récents => https://docs.djangoproject.com/en/2.1/ref/models/querysets/#q-objects