[1.8.x] Fixed #24249 -- Improved field shadowing validation in model multi-inheritance.

Backport of 4d73303ee9 from master
This commit is contained in:
Aron Podrigal 2015-01-30 04:40:25 -05:00 committed by Tim Graham
parent 8cb2cfdda5
commit eb9fbc0b1d
2 changed files with 26 additions and 1 deletions

View File

@ -1308,7 +1308,7 @@ class Model(six.with_metaclass(ModelBase)):
used_fields = {} # name or attname -> field used_fields = {} # name or attname -> field
# Check that multi-inheritance doesn't cause field name shadowing. # Check that multi-inheritance doesn't cause field name shadowing.
for parent in cls._meta.parents: for parent in cls._meta.get_parent_list():
for f in parent._meta.local_fields: for f in parent._meta.local_fields:
clash = used_fields.get(f.name) or used_fields.get(f.attname) or None clash = used_fields.get(f.name) or used_fields.get(f.attname) or None
if clash: if clash:

View File

@ -483,6 +483,31 @@ class ShadowingFieldsTests(IsolatedModelsTestCase):
] ]
self.assertEqual(errors, expected) self.assertEqual(errors, expected)
def test_multigeneration_inheritance(self):
class GrandParent(models.Model):
clash = models.IntegerField()
class Parent(GrandParent):
pass
class Child(Parent):
pass
class GrandChild(Child):
clash = models.IntegerField()
errors = GrandChild.check()
expected = [
Error(
"The field 'clash' clashes with the field 'clash' "
"from model 'invalid_models_tests.grandparent'.",
hint=None,
obj=GrandChild._meta.get_field('clash'),
id='models.E006',
)
]
self.assertEqual(errors, expected)
def test_id_clash(self): def test_id_clash(self):
class Target(models.Model): class Target(models.Model):
pass pass