Browse Source

Fixed #35301 -- Fixed Options._property_names for overriden properties.

Regression in faeb92ea13f0c1b2cc83f45b512f2c41cfb4f02d.
Adam Johnson 1 year ago
parent
commit
7646b9023d
2 changed files with 14 additions and 1 deletions
  1. 3 1
      django/db/models/options.py
  2. 11 0
      tests/invalid_models_tests/test_models.py

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

@@ -969,12 +969,14 @@ class Options:
     def _property_names(self):
         """Return a set of the names of the properties defined on the model."""
         names = set()
+        seen = set()
         for klass in self.model.__mro__:
             names |= {
                 name
                 for name, value in klass.__dict__.items()
-                if isinstance(value, property)
+                if isinstance(value, property) and name not in seen
             }
+            seen |= set(klass.__dict__)
         return frozenset(names)
 
     @cached_property

+ 11 - 0
tests/invalid_models_tests/test_models.py

@@ -1343,6 +1343,17 @@ class OtherModelTests(SimpleTestCase):
             ],
         )
 
+    def test_inherited_overriden_property_no_clash(self):
+        class Cheese:
+            @property
+            def filling_id(self):
+                pass
+
+        class Sandwich(Cheese, models.Model):
+            filling = models.ForeignKey("self", models.CASCADE)
+
+        self.assertEqual(Sandwich.check(), [])
+
     def test_single_primary_key(self):
         class Model(models.Model):
             foo = models.IntegerField(primary_key=True)