【问题标题】:How can I filter a Django query with a list of values?如何使用值列表过滤 Django 查询?
【发布时间】:2012-03-07 11:23:59
【问题描述】:

我确信这是一个微不足道的操作,但我不知道它是如何完成的。

肯定有比这更聪明的东西:

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 查询?

【问题讨论】:

标签: python django django-queryset


【解决方案1】:

来自Django documentation

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

【讨论】:

  • 如果我们传递空列表或不返回记录会引发错误吗?
  • @OmkarDeshpande No
  • @DylanYoung 所以它不会返回任何记录
  • @OmkarDeshpande 没错。不过,如果你调用get(),你当然会得到一个 ObjectDoesNotExist 错误。
  • 这将返回一个列表,@Omoidashita 的答案将返回一个对象键的字典。
【解决方案2】:

当您有项目列表并且想要检查列表中的可能值时,您不能使用=

sql 查询将类似于SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9],这是不正确的。为此,您必须使用 in 运算符,因此对于 Django 提供的 __in 运算符,您的查询将类似于 SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)

【讨论】:

  • +1 进行小解释。虽然我知道我可以阅读文档,但这并不一定意味着我理解文档。
【解决方案3】:

来自Django documentation

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>}

【讨论】:

  • 在某些情况下,这比接受的答案有优势。它返回一个将查询字段映射到对象的字典。
猜你喜欢
  • 2019-08-08
  • 2019-06-10
  • 2016-04-03
  • 2017-06-18
  • 2020-05-23
  • 1970-01-01
  • 2017-07-28
  • 2020-11-11
  • 1970-01-01
相关资源
最近更新 更多