Як я можу відфільтрувати запит Джанго зі списком значень?


291

Я впевнений, що це тривіальна операція, але я не можу зрозуміти, як це робиться.

Тут має бути щось розумніше:

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

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

Я хочу отримати їх за один запит із чимось на зразок:

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

Як я можу відфільтрувати запит Джанго зі списком значень?



Відповіді:


539

З документації про Джанго :

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

це призведе до помилки, якщо ми передамо порожній список або не повернемо запис?
Ракмо

@OmkarDeshpande Ні
DylanYoung

@DylanYoung Отже, запис не повернеться
Ракмо

2
@OmkarDeshpande Рівно. Хоча, якщо ви телефонуєте get(), ви отримаєте звичайно помилку ObjectDoesNotExist.
DylanYoung

48

Якщо у вас є список елементів, і ви хочете перевірити можливі значення зі списку, ви не можете їх використовувати =.

Запит sql буде таким, SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]що не відповідає дійсності. Ви повинні використовувати inоператора для цього, щоб ваш запит був подібний SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)до __inоператора, який надає Django .


20
+1 для невеликого пояснення. Хоча я знаю, що я можу читати документи, це не обов'язково означає, що я зрозумів документи.
Остін А

6

З документації про Джанго :

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>}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.