Say I have a list of photos ordered by creation date, as follows:
class Photo(models.Model):
title = models.Char()
image = models.Image()
created
You're in luck! Django creates get_next_by_foo and get_previous_by_foo methods by default for DateField & DateTimeField as long as they do not have null=True.
For example:
>>> from foo.models import Request
>>> r = Request.objects.get(id=1)
>>> r.get_next_by_created()
And if you reach the end of a set it will raise a DoesNotExist exception, which you could easily use as a trigger to return to the beginning of the set:
>>> r2 = r.get_next_by_created()
>>> r2.get_next_by_created()
...
DoesNotExist: Request matching query does not exist.
Further reading: Extra instance methods