Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Object Filter (last 1000)

Tags:

django

filter

How would one go about retrieving the last 1,000 values from a database via a Objects.filter? The one I am currently doing is bringing me the first 1,000 values to be entered into the database (i.e. 10,000 rows and it's bringing me the 1-1000, instead of 9000-1,000).

Current Code:

limit = 1000
Shop.objects.filter(ID = someArray[ID])[:limit]

Cheers

like image 664
Federer Avatar asked Oct 19 '09 11:10

Federer


1 Answers

Solution:

queryset = Shop.objects.filter(id=someArray[id])
limit = 1000
count = queryset.count()
endoflist = queryset.order_by('timestamp')[count-limit:]

endoflist is the queryset you want.


Efficiency:

The following is from the django docs about the reverse() queryset method.

To retrieve the ''last'' five items in a queryset, you could do this:

my_queryset.reverse()[:5]

Note that this is not quite the same as slicing from the end of a sequence in Python. The above example will return the last item first, then the penultimate item and so on. If we had a Python sequence and looked at seq[-5:], we would see the fifth-last item first. Django doesn't support that mode of access (slicing from the end), because it's not possible to do it efficiently in SQL.

So I'm not sure if my answer is merely inefficient, or extremely inefficient. I moved the order_by to the final query, but I'm not sure if this makes a difference.

like image 80
Alasdair Avatar answered Nov 15 '22 06:11

Alasdair