Home » Django » Get last record in a queryset

Get last record in a queryset

Posted by: admin November 30, 2017 Leave a comment

Questions:

How can I retrieve the last record in a certain queryset?

Answers:

You could simply do something like this, using reverse():

queryset.reverse()[0]

Also, beware this warning from the Django documentation:

… note that reverse() should
generally only be called on a QuerySet
which has a defined ordering (e.g.,
when querying against a model which
defines a default ordering, or when
using order_by()). If no such ordering
is defined for a given QuerySet,
calling reverse() on it has no real
effect (the ordering was undefined
prior to calling reverse(), and will
remain undefined afterward).

Questions:
Answers:

Django Doc:

latest(field_name=None) returns the latest object in the table, by date, using the field_name provided as the date field.

This example returns the latest Entry in the table, according to the
pub_date field:

Entry.objects.latest('pub_date')
Questions:
Answers:

Django >= 1.6

Added QuerySet methods first() and last() which are convenience methods returning the first or last object matching the filters. Returns None if there are no objects matching.

Questions:
Answers:

The simplest way to do it is:

books.objects.all().last()

You also use this to get the first entry like so:

books.objects.all().first()

Questions:
Answers:

To get First object:

ModelName.objects.first()

To get last objects:

ModelName.objects.last()

You can use filter

ModelName.objects.filter(name='simple').first()

This works for me.

Questions:
Answers:

If using django 1.6 and up, its much easier now as the new api been introduced –

Model.object.earliest()

It will give latest() with reverse direction.

p.s. – I know its old question, I posting as if going forward someone land on this question, they get to know this new feature and not end up using old method.

Questions:
Answers:

When the queryset is already exhausted, you may do this to avoid another db hint –

last = queryset[len(queryset) - 1] if queryset else None

Don’t use try...except....
Django doesn’t throw IndexError in this case.
It throws AssertionError or ProgrammingError(when you run python with -O option)

Questions:
Answers:

The simplest way, without having to worry about the current ordering, is to convert the QuerySet to a list so that you can use Python’s normal negative indexing. Like so:

list(User.objects.all())[-1]