web-dev-qa-db-fra.com

Comment filtrer une requête Django avec une liste de valeurs?

Je suis sûr que c'est une opération triviale, mais je ne peux pas comprendre comment ça se passe.

Il doit y avoir quelque chose de plus intelligent que cela:

ids = [1, 3, 6, 7, 9]

for id in ids:
    MyModel.objects.filter(pk=id)

Je cherche à obtenir tous dans une requête avec quelque chose comme:

MyModel.objects.filter(pk=[1, 3, 6, 7, 9])

Comment filtrer une requête Django avec une liste de valeurs?

238
ajwood

Depuis le documentation Django :

Blog.objects.filter(pk__in=[1, 4, 7])
464
charlax

Lorsque vous avez une liste d'éléments et que vous souhaitez vérifier les valeurs possibles de la liste, vous ne pouvez pas utiliser =.

La requête SQL ressemblera à SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9], ce qui n’est pas vrai. Vous devez utiliser l'opérateur in pour cela. Votre requête sera donc comme SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9) pour ce Django fournir __in opérateur.

43
Nilesh

Depuis le documentation Django :

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([])
{}

Blog.objects.in_bulk()
{1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>, 3: <Blog: Django Weblog>}

Blog.objects.in_bulk(['beatles_blog'], field_name='slug')
{'beatles_blog': <Blog: Beatles Blog>}
4
Omoidashita