diff options
| author | Nick Sandford <nick@sandford.id.au> | 2013-01-12 16:37:19 +0800 |
|---|---|---|
| committer | Anssi Kääriäinen <akaariai@gmail.com> | 2013-01-20 06:39:35 +0200 |
| commit | fe54377dae1357a7f102d72614a13f0ef8b2dbdf (patch) | |
| tree | 73920c4aa4a6d5cfad76a844c35cf25b36583a81 /django | |
| parent | 37718eb50b60f44462a64f735072e43a9d60b9a6 (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.py | 3 | ||||
| -rw-r--r-- | django/db/models/query.py | 22 |
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 |
