diff --git a/django/db/models/manager.py b/django/db/models/manager.py
index e1bbf6e..abff034 100644
--- a/django/db/models/manager.py
+++ b/django/db/models/manager.py
@@ -42,6 +42,7 @@ def ensure_default_manager(sender, **kwargs):
 
 signals.class_prepared.connect(ensure_default_manager)
 
+
 class Manager(object):
     # Tracks each time a Manager instance is created. Used to retain order.
     creation_counter = 0
@@ -160,6 +161,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)
 
@@ -208,6 +212,7 @@ class Manager(object):
     def raw(self, raw_query, params=None, *args, **kwargs):
         return RawQuerySet(raw_query=raw_query, model=self.model, params=params, using=self._db, *args, **kwargs)
 
+
 class ManagerDescriptor(object):
     # This class ensures managers aren't accessible via model instances.
     # For example, Poll.objects works, but poll_obj.objects raises AttributeError.
@@ -219,6 +224,7 @@ class ManagerDescriptor(object):
             raise AttributeError("Manager isn't accessible via %s instances" % type.__name__)
         return self.manager
 
+
 class EmptyManager(Manager):
     def get_query_set(self):
         return self.get_empty_query_set()
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 44acadf..d1319d0 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -25,6 +25,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.
@@ -458,21 +459,28 @@ class QuerySet(object):
                     # Re-raise the IntegrityError with its original traceback.
                     raise exc_info[1], None, exc_info[2]
 
-    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_or_latest() requires 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."
         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
@@ -1237,6 +1245,7 @@ class EmptyQuerySet(QuerySet):
     # situations).
     value_annotation = False
 
+
 def get_klass_info(klass, max_depth=0, cur_depth=0, requested=None,
                    only_load=None, local_only=False):
     """
diff --git a/docs/ref/models/options.txt b/docs/ref/models/options.txt
index 6ca3d3b..3e77b8b 100644
--- a/docs/ref/models/options.txt
+++ b/docs/ref/models/options.txt
@@ -78,6 +78,7 @@ Django quotes column and table names behind the scenes.
     setting, if set. If the backend doesn't support tablespaces, this option is
     ignored.
 
+
 ``get_latest_by``
 -----------------
 
diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt
index e25bea0..34e3fac 100644
--- a/docs/ref/models/querysets.txt
+++ b/docs/ref/models/querysets.txt
@@ -1466,14 +1466,15 @@ This example returns the latest ``Entry`` in the table, according to the
 
 If your model's :ref:`Meta <meta-options>` specifies
 :attr:`~django.db.models.Options.get_latest_by`, you can leave off the
-``field_name`` argument to ``latest()``. Django will use the field specified
-in :attr:`~django.db.models.Options.get_latest_by` by default.
+``field_name`` argument to ``earliest()`` or ``latest()``. Django will use the
+field specified in :attr:`~django.db.models.Options.get_latest_by` by default.
 
-Like :meth:`get()`, ``latest()`` raises
-:exc:`~django.core.exceptions.DoesNotExist` if there is no object with the given
-parameters.
+Like :meth:`get()`, ``earliest()`` and ``latest()`` raise
+:exc:`~django.core.exceptions.DoesNotExist` if there is no object with the
+given parameters.
 
-Note ``latest()`` exists purely for convenience and readability.
+Note that ``earliest()`` and ``latest()`` exist purely for convenience and
+readability.
 
 aggregate
 ~~~~~~~~~
diff --git a/docs/topics/db/models.txt b/docs/topics/db/models.txt
index 9b29e1e..85dbfea 100644
--- a/docs/topics/db/models.txt
+++ b/docs/topics/db/models.txt
@@ -973,10 +973,10 @@ right).
 
 So a child model does not have access to its parent's :ref:`Meta
 <meta-options>` class. However, there are a few limited cases where the child
-inherits behavior from the parent: if the child does not specify an
-:attr:`~django.db.models.Options.ordering` attribute or a
-:attr:`~django.db.models.Options.get_latest_by` attribute, it will inherit
-these from its parent.
+inherits behavior from the parent: if the child does not specify an attribute
+:attr:`~django.db.models.Options.ordering` or
+:attr:`~django.db.models.Options.get_latest_by`,
+, it will inherit these from its parent.
 
 If the parent has an ordering and you don't want the child to have any natural
 ordering, you can explicitly disable it::
diff --git a/tests/modeltests/get_earliest_or_latest/__init__.py b/tests/modeltests/get_earliest_or_latest/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/modeltests/get_earliest_or_latest/models.py b/tests/modeltests/get_earliest_or_latest/models.py
new file mode 100644
index 0000000..2453eaa
--- /dev/null
+++ b/tests/modeltests/get_earliest_or_latest/models.py
@@ -0,0 +1,32 @@
+"""
+8. get_latest_by
+
+Models can have a ``get_latest_by`` attribute, which should be set to the name
+of a ``DateField`` or ``DateTimeField``. If ``get_latest_by`` exists, the
+model's manager will get a ``latest()`` method, which will return the latest
+object in the database according to that field. "Latest" means "having the date
+farthest into the future."
+"""
+
+from django.db import models
+
+
+class Article(models.Model):
+    headline = models.CharField(max_length=100)
+    pub_date = models.DateField()
+    expire_date = models.DateField()
+    class Meta:
+        get_latest_by = 'pub_date'
+
+    def __unicode__(self):
+        return self.headline
+
+
+class Person(models.Model):
+    name = models.CharField(max_length=30)
+    birthday = models.DateField()
+
+    # Note that this model doesn't have "get_latest_by" set.
+
+    def __unicode__(self):
+        return self.name
diff --git a/tests/modeltests/get_earliest_or_latest/tests.py b/tests/modeltests/get_earliest_or_latest/tests.py
new file mode 100644
index 0000000..7dca7ed
--- /dev/null
+++ b/tests/modeltests/get_earliest_or_latest/tests.py
@@ -0,0 +1,121 @@
+from __future__ import absolute_import
+
+from datetime import datetime
+
+from django.test import TestCase
+
+from .models import Article, Person
+
+
+class EarliestOrLatestTests(TestCase):
+    """Tests for the earliest() and latest() objects methods"""
+
+    def test_earliest(self):
+        # Because no Articles exist yet, earliest() raises ArticleDoesNotExist.
+        self.assertRaises(Article.DoesNotExist, Article.objects.earliest)
+
+        a1 = Article.objects.create(
+            headline="Article 1", pub_date=datetime(2005, 7, 26),
+            expire_date=datetime(2005, 9, 1)
+        )
+        a2 = Article.objects.create(
+            headline="Article 2", pub_date=datetime(2005, 7, 27),
+            expire_date=datetime(2005, 7, 28)
+        )
+        a3 = Article.objects.create(
+            headline="Article 3", pub_date=datetime(2005, 7, 28),
+            expire_date=datetime(2005, 8, 27)
+        )
+        a4 = Article.objects.create(
+            headline="Article 4", pub_date=datetime(2005, 7, 28),
+            expire_date=datetime(2005, 7, 30)
+        )
+
+        # Get the earliest Article.
+        self.assertEqual(Article.objects.earliest(), a1)
+        # Get the earliest Article that matches certain filters.
+        self.assertEqual(
+            Article.objects.filter(pub_date__gt=datetime(2005, 7, 26)).earliest(),
+            a2
+        )
+
+        # Pass a custom field name to earliest() to change the field that's used
+        # to determine the earliest object.
+        self.assertEqual(Article.objects.earliest('expire_date'), a2)
+        self.assertEqual(Article.objects.filter(
+            pub_date__gt=datetime(2005, 7, 26)).earliest('expire_date'), a2)
+
+        # Ensure that earliest() overrides any other ordering specified on the
+        # query. Refs #11283.
+        self.assertEqual(Article.objects.order_by('id').earliest(), a1)
+
+        # Ensure that error is raised if the user forgot to add a get_latest_by
+        # in the Model.Meta
+        Article.objects.model._meta.get_latest_by = None
+        self.assertRaisesMessage(
+            AssertionError,
+            "_earliest_or_latest() requires either a field_name parameter or "\
+                "'get_latest_by' in the model",
+            lambda: Article.objects.earliest(),
+        )
+
+
+    def test_latest(self):
+        # Because no Articles exist yet, latest() raises ArticleDoesNotExist.
+        self.assertRaises(Article.DoesNotExist, Article.objects.latest)
+
+        a1 = Article.objects.create(
+            headline="Article 1", pub_date=datetime(2005, 7, 26),
+            expire_date=datetime(2005, 9, 1)
+        )
+        a2 = Article.objects.create(
+            headline="Article 2", pub_date=datetime(2005, 7, 27),
+            expire_date=datetime(2005, 7, 28)
+        )
+        a3 = Article.objects.create(
+            headline="Article 3", pub_date=datetime(2005, 7, 27),
+            expire_date=datetime(2005, 8, 27)
+        )
+        a4 = Article.objects.create(
+            headline="Article 4", pub_date=datetime(2005, 7, 28),
+            expire_date=datetime(2005, 7, 30)
+        )
+
+        # Get the latest Article.
+        self.assertEqual(Article.objects.latest(), a4)
+        # Get the latest Article that matches certain filters.
+        self.assertEqual(
+            Article.objects.filter(pub_date__lt=datetime(2005, 7, 27)).latest(),
+            a1
+        )
+
+        # Pass a custom field name to latest() to change the field that's used
+        # to determine the latest object.
+        self.assertEqual(Article.objects.latest('expire_date'), a1)
+        self.assertEqual(
+            Article.objects.filter(pub_date__gt=datetime(2005, 7, 26)).latest('expire_date'),
+            a3,
+        )
+
+        # Ensure that latest() overrides any other ordering specified on the query. Refs #11283.
+        self.assertEqual(Article.objects.order_by('id').latest(), a4)
+
+        # Ensure that error is raised if the user forgot to add a get_latest_by
+        # in the Model.Meta
+        Article.objects.model._meta.get_latest_by = None
+        self.assertRaisesMessage(
+            AssertionError,
+            "_earliest_or_latest() requires either a field_name parameter or "\
+                "'get_latest_by' in the model",
+            lambda: Article.objects.latest(),
+        )
+
+
+    def test_latest_manual(self):
+        # You can still use latest() with a model that doesn't have
+        # "get_latest_by" set -- just pass in the field name manually.
+        p1 = Person.objects.create(name="Ralph", birthday=datetime(1950, 1, 1))
+        p2 = Person.objects.create(name="Stephanie", birthday=datetime(1960, 2, 3))
+        self.assertRaises(AssertionError, Person.objects.latest)
+
+        self.assertEqual(Person.objects.latest("birthday"), p2)
