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?



Réponses:


538

De la documentation Django :

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

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 .


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>}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.