Specifying limit and offset in Django QuerySet wont work

The LIMIT and OFFSET doesn't work in the same way in Django, the way we expect it to work.

For example.

If we have to read next 10 rows starting from 10th row and if we specify :

Author.objects.all()[10:10]

It will return the empty record list. In order to fetch the next 10 rows, we have to add the offset to the limit.

Author.objects.all()[10:10+10]

And it will return the record list of next 10 rows starting from the 10th row.


Django implements OFFSET using Python’s array-slicing syntax. If you want to offset the first 10 elements and then show the next 5 elements then use it

MyModel.objects.all()[OFFSET:OFFSET+LIMIT]

For example if you wanted to check 5 authors after an offset of 10 then your code would look something like this:

Author.objects.all()[10:15]

You can read more about it here in the official Django doc

I have also written a blog around this concept, you can here more here


It happens when you make queries from the shell - the LIMIT clause is added to stop your terminal filling up with thousands of records when debugging:

You were printing (or, at least, trying to print) the repr() of the queryset. To avoid people accidentally trying to retrieve and print a million results, we (well, I) changed that to only retrieve and print the first 20 results and print "remainder truncated" if there were more. This is achieved by limiting the query to 21 results (if there are 21 results there are more than 20, so we print the "truncated" message). That only happens in the repr() -- i.e. it's only for diagnostic printing. No normal user code has this limit included automatically, so you happily create a queryset that iterates over a million results.

(Source)


for offset and limit i used and worked for me :)

MyModel.objects.all()[offset:limit]

for exapmle:-

Post.objects.filter(Post_type=typeId)[1:1]