465

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

4 Answers 4

845

From the Django documentation:

Blog.objects.filter(pk__in=[1, 4, 7])
Sign up to request clarification or add additional context in comments.

6 Comments

will it raise error if we pass empty list or return no record ?
@OmkarDeshpande No
@DylanYoung So it will return no record
@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.
|
69

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 Comment

+1 for a small explanation. While I know I can read the docs, that doesn't necessarily mean I understood the docs.
17

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 Comment

This has an advantage over the accepted answer in some cases. It returns a dictionary mapping the queried field to the object.
6

You can do like this.

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

But you should be careful. If just one element in the list is No-integer it doesn't work. For example this is an Exception.

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.