Browse Source

Fixed #31538 -- Fixed Meta.ordering validation lookups that are not transforms.

Regression in 440505cb2cadbe1a5b9fba246bcde6c04f51d07e.

Thanks Simon Meers for the report.
Mariusz Felisiak 4 years ago
parent
commit
b73e66e758
3 changed files with 14 additions and 2 deletions
  1. 3 1
      django/db/models/base.py
  2. 2 1
      docs/releases/3.0.7.txt
  3. 9 0
      tests/invalid_models_tests/test_models.py

+ 3 - 1
django/db/models/base.py

@@ -1747,7 +1747,9 @@ class Model(metaclass=ModelBase):
                     else:
                         _cls = None
                 except (FieldDoesNotExist, AttributeError):
-                    if fld is None or fld.get_transform(part) is None:
+                    if fld is None or (
+                        fld.get_transform(part) is None and fld.get_lookup(part) is None
+                    ):
                         errors.append(
                             checks.Error(
                                 "'ordering' refers to the nonexistent field, "

+ 2 - 1
docs/releases/3.0.7.txt

@@ -9,4 +9,5 @@ Django 3.0.7 fixes several bugs in 3.0.6.
 Bugfixes
 ========
 
-* ...
+* Fixed a regression in Django 3.0 by restoring the ability to use field
+  lookups in ``Meta.ordering`` (:ticket:`31538`).

+ 9 - 0
tests/invalid_models_tests/test_models.py

@@ -893,6 +893,15 @@ class OtherModelTests(SimpleTestCase):
         with register_lookup(models.CharField, Lower):
             self.assertEqual(Model.check(), [])
 
+    def test_ordering_pointing_to_lookup_not_transform(self):
+        class Model(models.Model):
+            test = models.CharField(max_length=100)
+
+            class Meta:
+                ordering = ('test__isnull',)
+
+        self.assertEqual(Model.check(), [])
+
     def test_ordering_pointing_to_related_model_pk(self):
         class Parent(models.Model):
             pass