ChatGPT解决这个技术问题 Extra ChatGPT

如何使用值列表过滤 Django 查询?

我确信这是一个微不足道的操作,但我无法弄清楚它是如何完成的。

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

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


p
phoenix

Django documentation

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

如果我们传递空列表或不返回记录,它会引发错误吗?
@OmkarDeshpande 没有
@DylanYoung 所以它不会返回任何记录
@OmkarDeshpande 没错。但是,如果您调用 get(),您当然会收到 ObjectDoesNotExist 错误。
这将返回一个列表,@Omoidashita 的答案将返回一个对象键的字典。
N
Nilesh

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

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 作一个小小的解释。虽然我知道我可以阅读文档,但这并不一定意味着我理解文档。
F
Francisco

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

在某些情况下,这比接受的答案具有优势。它返回一个将查询字段映射到对象的字典。