I’m sure this is a trivial operation, but I can’t figure out how it’s done.
There’s got to be something smarter than this:
ids = [1, 3, 6, 7, 9]
for id in ids:
MyModel.objects.filter(pk=id)
I’m looking to get them all in one query with something like:
MyModel.objects.filter(pk=[1, 3, 6, 7, 9])
How can I filter a Django query with a list of values?
2
3 Answers
From the Django documentation:
Blog.objects.filter(pk__in=[1, 4, 7])
5
will it raise error if we pass empty list or return no record ?
– Rakmo@OmkarDeshpande No
@DylanYoung So it will return no record
– Rakmo@OmkarDeshpande Exactly. Though,if you call
get()
, you will get an ObjectDoesNotExist error of course.This will return a list, @Omoidashita’s answer will return a dictionary of keys to objects.
– Laizer
When you have list of items and you want to check the possible values from the list then you can’t use =
.
The sql query will be like SELECT * FROM mytable WHERE ids=[1, 3, 6, 7, 9]
which is not true. You have to use in
operator for this so you query will be like SELECT * FROM mytable WHERE ids in (1, 3, 6, 7, 9)
for that Django provide __in
operator.
1
+1 for a small explanation. While I know I can read the docs, that doesn’t necessarily mean I understood the docs.
– Austin A
From the 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>}
1
This has an advantage over the accepted answer in some cases. It returns a dictionary mapping the queried field to the object.
– Laizer
possible duplicate of How to filter a django queryset using an array on a field like SQL’s “IN”?
Possible duplicate of How to filter a django queryset using an array on a field like SQL’s “IN”?