Wie kann ich eine Django-Abfrage mit einer Werteliste filtern?

290

Ich bin sicher, dass dies eine triviale Operation ist, aber ich kann nicht herausfinden, wie es gemacht wird.

Es muss etwas Klügeres geben:

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

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

Ich möchte sie alle in einer Abfrage mit so etwas wie:

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

Wie kann ich eine Django-Abfrage mit einer Werteliste filtern?

Ajwood
quelle

Antworten:

538

Aus der Django-Dokumentation :

Blog.objects.filter(pk__in=[1, 4, 7])
charlax
quelle
Wird es einen Fehler auslösen, wenn wir eine leere Liste übergeben oder keinen Datensatz zurückgeben?
Rakmo
@ OmkarDeshpande No
DylanYoung
@ DylanYoung Also wird es keine Aufzeichnung zurückgeben
Rakmo
2
@ OmkarDeshpande Genau. Wenn Sie anrufen get(), erhalten Sie natürlich einen ObjectDoesNotExist-Fehler.
DylanYoung
48

Wenn Sie eine Liste mit Elementen haben und die möglichen Werte aus der Liste überprüfen möchten, können Sie diese nicht verwenden =.

Die SQL-Abfrage ist wie folgt, SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]was nicht wahr ist. Sie müssen hierfür den inOperator verwenden, damit Ihre Abfrage SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)dem von Django __inbereitgestellten Operator entspricht.

Nilesh
quelle
20
+1 für eine kleine Erklärung. Obwohl ich weiß, dass ich die Dokumente lesen kann, bedeutet dies nicht unbedingt, dass ich die Dokumente verstanden habe.
Austin A
6

Aus der Django-Dokumentation :

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
quelle