Jak mogę odfiltrować zapytanie Django z listą wartości?


291

Jestem pewien, że jest to trywialna operacja, ale nie mogę zrozumieć, jak to się robi.

Musi być coś mądrzejszego niż to:

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

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

Chcę uzyskać je wszystkie w jednym zapytaniu za pomocą czegoś takiego:

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

Jak mogę odfiltrować zapytanie Django z listą wartości?



Odpowiedzi:


539

Z dokumentacji Django :

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

czy zgłosi błąd, jeśli przekażemy pustą listę lub nie zwrócimy żadnego rekordu?
Rakmo

@OmkarDeshpande No
DylanYoung

@DylanYoung Więc nie zwróci żadnego rekordu
Rakmo

2
@OmkarDeshpande Dokładnie. Chociaż, jeśli zadzwonisz get(), otrzymasz oczywiście błąd ObjectDoesNotExist.
DylanYoung,

48

Gdy masz listę elementów i chcesz sprawdzić możliwe wartości z listy, nie możesz jej użyć =.

Zapytanie sql będzie takie, SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]które nie jest prawdą. W tym celu należy użyć inoperatora, aby zapytanie było podobne SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)do tego __inoperatora Django .


20
+1 za małe wyjaśnienie. Chociaż wiem, że mogę czytać dokumenty, nie musi to wcale oznaczać, że je zrozumiałem.
Austin A

6

Z dokumentacji 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>}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.