From da8f85aa82a8810cac8c0225c1f8862e5d9aea64 Mon Sep 17 00:00:00 2001 From: Hasan Ramezani Date: Thu, 26 Sep 2019 10:33:54 +0200 Subject: [PATCH] [3.0.x] Refs #30798 -- Prevented chaining fields from the same related model multiple times in model Meta.ordering. Backport of c7944628a1979453468d67818c63957532d396d8 from master --- django/db/models/base.py | 2 ++ tests/invalid_models_tests/test_models.py | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) 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)