Index: django/db/models/sql/query.py
===================================================================
--- django/db/models/sql/query.py	(revision 14821)
+++ django/db/models/sql/query.py	(working copy)
@@ -1554,6 +1554,17 @@
             raise FieldError('Invalid order_by arguments: %s' % errors)
         if ordering:
             self.order_by.extend(ordering)
+            # Validate field names
+            for field in ordering:
+                if field != '?' and not isinstance(field, int) and '.' not in field:
+                    col, order = get_order_dir(field)
+                    if col not in (self.aggregate_select.keys() \
+                                   + self.extra_select.keys()):
+                        # This is called to trigger any applicable FieldErrors
+                        self.setup_joins(col.split(LOOKUP_SEP),
+                                         self.model._meta,
+                                         self.get_initial_alias(),
+                                         False)
         else:
             self.default_ordering = False
 
Index: tests/regressiontests/model_fields/tests.py
===================================================================
--- tests/regressiontests/model_fields/tests.py	(revision 14821)
+++ tests/regressiontests/model_fields/tests.py	(working copy)
@@ -3,7 +3,7 @@
 
 from django import test
 from django import forms
-from django.core.exceptions import ValidationError
+from django.core.exceptions import FieldError, ValidationError
 from django.db import models
 from django.db.models.fields.files import FieldFile
 from django.utils import unittest
@@ -348,3 +348,12 @@
         field = d._meta.get_field('myfile')
         field.save_form_data(d, 'else.txt')
         self.assertEqual(d.myfile, 'else.txt')
+
+class FieldErrorTest(unittest.TestCase):
+    def test_field_error(self):
+        """
+        Test that order_by arguments are validated without executing the query.
+        """
+        # Regression test for #14766
+        self.assertRaises(FieldError, Foo.objects.order_by, 'nonexistent_field')
+        self.assertRaises(FieldError, Bar.objects.order_by, 'a__nonexistent_field')
