summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorNick Sandford <nick@sandford.id.au>2013-01-12 16:37:19 +0800
committerAnssi Kääriäinen <akaariai@gmail.com>2013-01-20 06:39:35 +0200
commitfe54377dae1357a7f102d72614a13f0ef8b2dbdf (patch)
tree73920c4aa4a6d5cfad76a844c35cf25b36583a81 /django
parent37718eb50b60f44462a64f735072e43a9d60b9a6 (diff)
Fixed #17813 -- Added a .earliest() method to QuerySet
Thanks a lot to everybody participating in developing this feature. The patch was developed by multiple people, at least Trac aliases tonnzor, jimmysong, Fandekasp and slurms. Stylistic changes added by committer.
Diffstat (limited to 'django')
-rw-r--r--django/db/models/manager.py3
-rw-r--r--django/db/models/query.py22
2 files changed, 18 insertions, 7 deletions
diff --git a/django/db/models/manager.py b/django/db/models/manager.py
index da6523c89a..816f6194e3 100644
--- a/django/db/models/manager.py
+++ b/django/db/models/manager.py
@@ -172,6 +172,9 @@ class Manager(object):
def iterator(self, *args, **kwargs):
return self.get_query_set().iterator(*args, **kwargs)
+ def earliest(self, *args, **kwargs):
+ return self.get_query_set().earliest(*args, **kwargs)
+
def latest(self, *args, **kwargs):
return self.get_query_set().latest(*args, **kwargs)
diff --git a/django/db/models/query.py b/django/db/models/query.py
index bdb6d48adc..1c9a68a677 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -29,6 +29,7 @@ REPR_OUTPUT_SIZE = 20
# Pull into this namespace for backwards compatibility.
EmptyResultSet = sql.EmptyResultSet
+
class QuerySet(object):
"""
Represents a lazy database lookup for a set of objects.
@@ -487,21 +488,28 @@ class QuerySet(object):
# Re-raise the IntegrityError with its original traceback.
six.reraise(*exc_info)
- def latest(self, field_name=None):
+ def _earliest_or_latest(self, field_name=None, direction="-"):
"""
- Returns the latest object, according to the model's 'get_latest_by'
- option or optional given field_name.
+ Returns the latest object, according to the model's
+ 'get_latest_by' option or optional given field_name.
"""
- latest_by = field_name or self.model._meta.get_latest_by
- assert bool(latest_by), "latest() requires either a field_name parameter or 'get_latest_by' in the model"
+ order_by = field_name or getattr(self.model._meta, 'get_latest_by')
+ assert bool(order_by), "earliest() and latest() require either a "\
+ "field_name parameter or 'get_latest_by' in the model"
assert self.query.can_filter(), \
- "Cannot change a query once a slice has been taken."
+ "Cannot change a query once a slice has been taken."
obj = self._clone()
obj.query.set_limits(high=1)
obj.query.clear_ordering()
- obj.query.add_ordering('-%s' % latest_by)
+ obj.query.add_ordering('%s%s' % (direction, order_by))
return obj.get()
+ def earliest(self, field_name=None):
+ return self._earliest_or_latest(field_name=field_name, direction="")
+
+ def latest(self, field_name=None):
+ return self._earliest_or_latest(field_name=field_name, direction="-")
+
def in_bulk(self, id_list):
"""
Returns a dictionary mapping each of the given IDs to the object with