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

290

Je suis sûr que c'est une opération banale, mais je ne peux pas comprendre comment cela se fait.

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 à les obtenir tous dans une seule 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?

ajwood
la source

Réponses:

538

De la documentation Django :

Blog.objects.filter(pk__in=[1, 4, 7])
charlax
la source
cela provoquera-t-il une erreur si nous passons une liste vide ou si nous ne renvoyons aucun enregistrement?
Rakmo
@OmkarDeshpande No
DylanYoung
@DylanYoung Donc, il ne retournera aucun record
Rakmo
2
@OmkarDeshpande Exactement. Cependant, si vous appelez get(), vous obtiendrez bien sûr une erreur ObjectDoesNotExist.
DylanYoung
48

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 sera comme SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]ce qui n'est pas vrai. Vous devez utiliser l' inopérateur pour cela, donc votre requête sera comme SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)pour cet __inopérateur de fourniture de Django .

Nilesh
la source
20
+1 pour une petite explication. Bien que je sache que je peux lire les documents, cela ne signifie pas nécessairement que j'ai compris les documents.
Austin A
6

De la 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>}
Omoidashita
la source