Как я могу отфильтровать запрос Django со списком значений?

292

Я уверен, что это тривиальная операция, но я не могу понять, как это делается.

Должно быть что-то умнее, чем это:

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

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

Я хочу получить их все в одном запросе с чем-то вроде:

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

Как я могу отфильтровать запрос Django со списком значений?

ajwood
источник

Ответы:

542

Из документации Django :

Blog.objects.filter(pk__in=[1, 4, 7])
charlax
источник
это вызовет ошибку, если мы передадим пустой список или не вернем запись?
Ракмо
@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 .

Nilesh
источник
20
+1 за небольшое объяснение. Хотя я знаю, что могу читать документы, это не обязательно означает, что я понял документы.
Остин,
6

Из документации 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>}
Omoidashita
источник