Фильтр Django со списком значений

191

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

Там должно быть что-то умнее этого:

ids = [1, 3, 6, 7, 9]
for id in ids:
   MyModel.objects.filter( pk=id )

Я хочу, чтобы все они были в одном шоу с чем-то вроде:

ids = [1, 3, 6, 7, 9]
MyModel.objects.filter( pk=ids )
Теги:

3 ответа

386
Лучший ответ

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

Blog.objects.filter(pk__in=[1, 4, 7])
  • 0
    это вызовет ошибку, если мы передадим пустой список или не вернем запись?
  • 0
    @OmkarDeshpande Нет
Показать ещё 2 комментария
40

Когда у вас есть список элементов, и вы хотите проверить возможные значения из списка, вы не можете использовать =.

Запрос sql будет похож на SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9], что неверно. Для этого вам нужно использовать оператор in, поэтому запрос будет выглядеть как SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9), для этого Django предоставляет оператор __in.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню