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?



Antworten:


538

Aus der Django-Dokumentation :

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

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.


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>}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.