Fixed #22047 -- detecting related_name clash with inheritance
Thanks to mondone for fruitful colaboration.
This commit is contained in:
parent
65b421c661
commit
d0133504e5
|
@ -183,7 +183,7 @@ class RelatedField(Field):
|
||||||
# Check clashes between accessor or reverse query name of `field`
|
# Check clashes between accessor or reverse query name of `field`
|
||||||
# and any other field name -- i. e. accessor for Model.foreign is
|
# and any other field name -- i. e. accessor for Model.foreign is
|
||||||
# model_set and it clashes with Target.model_set.
|
# model_set and it clashes with Target.model_set.
|
||||||
potential_clashes = rel_opts.fields + rel_opts.local_many_to_many
|
potential_clashes = rel_opts.fields + rel_opts.many_to_many
|
||||||
for clash_field in potential_clashes:
|
for clash_field in potential_clashes:
|
||||||
clash_name = "%s.%s" % (rel_opts.object_name,
|
clash_name = "%s.%s" % (rel_opts.object_name,
|
||||||
clash_field.name) # i. e. "Target.model_set"
|
clash_field.name) # i. e. "Target.model_set"
|
||||||
|
|
|
@ -583,6 +583,35 @@ class AccessorClashTests(IsolatedModelsTestCase):
|
||||||
]
|
]
|
||||||
self.assertEqual(errors, expected)
|
self.assertEqual(errors, expected)
|
||||||
|
|
||||||
|
def test_m2m_to_m2m_with_inheritance(self):
|
||||||
|
""" Ref #22047. """
|
||||||
|
|
||||||
|
class Target(models.Model):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Model(models.Model):
|
||||||
|
children = models.ManyToManyField('Child',
|
||||||
|
related_name="m2m_clash", related_query_name="no_clash")
|
||||||
|
|
||||||
|
class Parent(models.Model):
|
||||||
|
m2m_clash = models.ManyToManyField('Target')
|
||||||
|
|
||||||
|
class Child(Parent):
|
||||||
|
pass
|
||||||
|
|
||||||
|
errors = Model.check()
|
||||||
|
expected = [
|
||||||
|
Error(
|
||||||
|
'Accessor for field Model.children clashes with field Child.m2m_clash.',
|
||||||
|
hint=('Rename field Child.m2m_clash or add/change '
|
||||||
|
'a related_name argument to the definition '
|
||||||
|
'for field Model.children.'),
|
||||||
|
obj=Model._meta.get_field('children'),
|
||||||
|
id='E014',
|
||||||
|
)
|
||||||
|
]
|
||||||
|
self.assertEqual(errors, expected)
|
||||||
|
|
||||||
|
|
||||||
class ReverseQueryNameClashTests(IsolatedModelsTestCase):
|
class ReverseQueryNameClashTests(IsolatedModelsTestCase):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue