Index: django/db/models/sql/compiler.py
===================================================================
--- django/db/models/sql/compiler.py	(revision 14551)
+++ django/db/models/sql/compiler.py	(working copy)
@@ -5,7 +5,7 @@
 from django.db.models.sql.datastructures import EmptyResultSet
 from django.db.models.sql.expressions import SQLEvaluator
 from django.db.models.sql.query import get_proxied_model, get_order_dir, \
-     select_related_descend, Query
+     select_related_descend, Query, InvalidQuery
 
 class SQLCompiler(object):
     def __init__(self, query, connection, using):
@@ -516,6 +516,7 @@
 
         # Setup for the case when only particular related fields should be
         # included in the related selection.
+        fields_found = set()
         if requested is None:
             if isinstance(self.query.select_related, dict):
                 requested = self.query.select_related
@@ -526,6 +527,7 @@
         for f, model in opts.get_fields_with_model():
             if not select_related_descend(f, restricted, requested):
                 continue
+            fields_found.add(f.name)
             # The "avoid" set is aliases we want to avoid just for this
             # particular branch of the recursion. They aren't permanently
             # forbidden from reuse in the related selection tables (which is
@@ -591,6 +593,10 @@
                     used, next, restricted, new_nullable, dupe_set, avoid)
 
         if restricted:
+            fields_not_found = set(requested.keys()).difference(fields_found)
+            if fields_not_found:
+                raise InvalidQuery("Invalid field name(s) %s in select_related() %s" %
+                                   (",".join(list(fields_not_found)),requested))
             related_fields = [
                 (o.field, o.model)
                 for o in opts.get_all_related_objects()
Index: tests/modeltests/select_related/tests.py
===================================================================
--- tests/modeltests/select_related/tests.py	(revision 14551)
+++ tests/modeltests/select_related/tests.py	(working copy)
@@ -1,4 +1,5 @@
 from django.test import TestCase
+from django.db.models.sql.query import InvalidQuery
 
 from models import Domain, Kingdom, Phylum, Klass, Order, Family, Genus, Species
 
@@ -142,6 +143,25 @@
                 ['Drosophilidae', 'Hominidae', 'Fabaceae', 'Amanitacae'])
         self.assertNumQueries(1, test)
 
+    def test_certain_fields_fails(self):
+        """
+        In this case we pass some invalid field name(s). InvalidQuery 
+        exception is expected.
+        """
+        def test(*args):
+            world = list(Species.objects.select_related(*args))
+
+        self.assertNumQueries(1,        test, 'genus', 'genus__family')
+        self.assertRaises(InvalidQuery, test, 'genusFAIL', 'genus__family')
+        self.assertRaises(InvalidQuery, test, 'genus', 'genus__familyFAIL')
+        self.assertRaises(InvalidQuery, test, 'genusFAIL', 'genusFAIL__family')
+
+        self.assertNumQueries(1,        test, 'genus__family__order')
+        self.assertRaises(InvalidQuery, test, 'genusFAIL__family__order')
+        self.assertRaises(InvalidQuery, test, 'genus__familyFAIL__order')
+        self.assertRaises(InvalidQuery, test, 'genus__family__orderFAIL')
+
+
     def test_more_certain_fields(self):
         """
         In this case, we explicitly say to select the 'genus' and
