django过滤器包含值列表

ajw*_*ood 255 python django django-queryset

我确定这是一个微不足道的操作,但我无法弄清楚它是如何完成的...如何为值列表创建一个django查询.

必须有比这更聪明的东西:

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

for id in ids:
    MyModel.objects.filter(pk=id)
Run Code Online (Sandbox Code Playgroud)

我想把它们全部放在一个节目中,例如:

MyModel.objects.filter(pk=[1, 3, 6, 7, 9])
Run Code Online (Sandbox Code Playgroud)

cha*_*lax 490

Django文档:

Blog.objects.filter(pk__in=[1, 4, 7])
Run Code Online (Sandbox Code Playgroud)

  • @OmkarDeshpande 没错。但是,如果你调用`get()`,你当然会得到一个 ObjectDoesNotExist 错误。 (2认同)

Nil*_*esh 44

如果您有项目列表,并且想要从列表中检查可能的值,则无法使用=.

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运算符.

  • +1为一个小解释.虽然我知道我可以阅读文档,但这并不一定意味着我理解了文档. (17认同)

小智 5

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>}
Run Code Online (Sandbox Code Playgroud)

  • 在某些情况下,这比公认的答案更有优势。它返回一个将查询字段映射到对象的字典。 (2认同)

小智 5

你可以这样做。

Blog.objects.filter(pk__in=[1, 4, 7])
Run Code Online (Sandbox Code Playgroud)

但你应该小心。如果列表中只有一个元素是非整数,则它不起作用。例如,这是一个异常。

Blog.objects.filter(pk__in=[1, 4, 'aa', 7])
Run Code Online (Sandbox Code Playgroud)