Fixed #22356 -- Added a check to make sure unique_together fields are local.
This commit is contained in:
parent
17c1884456
commit
0bcc92c691
|
@ -1346,6 +1346,19 @@ class Model(six.with_metaclass(ModelBase)):
|
|||
id='models.E013',
|
||||
)
|
||||
)
|
||||
elif field not in cls._meta.local_fields:
|
||||
errors.append(
|
||||
checks.Error(
|
||||
("'%s' refers to field '%s' which is not local "
|
||||
"to model '%s'.") % (
|
||||
option, field_name, cls._meta.object_name
|
||||
),
|
||||
hint=("This issue may be caused by multi-table "
|
||||
"inheritance."),
|
||||
obj=cls,
|
||||
id='models.E016',
|
||||
)
|
||||
)
|
||||
return errors
|
||||
|
||||
@classmethod
|
||||
|
|
|
@ -44,6 +44,7 @@ Models
|
|||
* **models.E013**: ``index_together/unique_together`` refers to a ManyToManyField ``<field name>``, but ManyToManyFields are not supported for that option.
|
||||
* **models.E014**: ``ordering`` must be a tuple or list (even if you want to order by only one field).
|
||||
* **models.E015**: ``ordering`` refers to the non-existent field ``<field name>``.
|
||||
* **models.E016**: ``index_together/unique_together`` refers to field ``<field_name>`` which is not local to model ``<model>``.
|
||||
|
||||
Fields
|
||||
~~~~~~
|
||||
|
|
|
@ -76,6 +76,30 @@ class IndexTogetherTests(IsolatedModelsTestCase):
|
|||
]
|
||||
self.assertEqual(errors, expected)
|
||||
|
||||
def test_pointing_to_non_local_field(self):
|
||||
class Foo(models.Model):
|
||||
field1 = models.IntegerField()
|
||||
|
||||
class Bar(Foo):
|
||||
field2 = models.IntegerField()
|
||||
|
||||
class Meta:
|
||||
index_together = [
|
||||
["field2", "field1"],
|
||||
]
|
||||
|
||||
errors = Bar.check()
|
||||
expected = [
|
||||
Error(
|
||||
("'index_together' refers to field 'field1' which is not "
|
||||
"local to model 'Bar'."),
|
||||
hint=("This issue may be caused by multi-table inheritance."),
|
||||
obj=Bar,
|
||||
id='models.E016',
|
||||
),
|
||||
]
|
||||
self.assertEqual(errors, expected)
|
||||
|
||||
def test_pointing_to_m2m_field(self):
|
||||
class Model(models.Model):
|
||||
m2m = models.ManyToManyField('self')
|
||||
|
|
Loading…
Reference in New Issue