diff --git a/django/db/models/base.py b/django/db/models/base.py index 3ce711f3f1..fe3d84677a 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -1711,6 +1711,8 @@ class Model(metaclass=ModelBase): fld = _cls._meta.get_field(part) if fld.is_relation: _cls = fld.get_path_info()[-1].to_opts.model + else: + _cls = None except (FieldDoesNotExist, AttributeError): if fld is None or fld.get_transform(part) is None: errors.append( diff --git a/tests/invalid_models_tests/test_models.py b/tests/invalid_models_tests/test_models.py index 0f1d1e4dc3..02db3ea54a 100644 --- a/tests/invalid_models_tests/test_models.py +++ b/tests/invalid_models_tests/test_models.py @@ -814,6 +814,26 @@ class OtherModelTests(SimpleTestCase): ) ]) + def test_ordering_pointing_multiple_times_to_model_fields(self): + class Parent(models.Model): + field1 = models.CharField(max_length=100) + field2 = models.CharField(max_length=100) + + class Child(models.Model): + parent = models.ForeignKey(Parent, models.CASCADE) + + class Meta: + ordering = ('parent__field1__field2',) + + self.assertEqual(Child.check(), [ + Error( + "'ordering' refers to the nonexistent field, related field, " + "or lookup 'parent__field1__field2'.", + obj=Child, + id='models.E015', + ) + ]) + def test_ordering_allows_registered_lookups(self): class Model(models.Model): test = models.CharField(max_length=100)