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',
|
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
|
return errors
|
||||||
|
|
||||||
@classmethod
|
@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.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.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.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
|
Fields
|
||||||
~~~~~~
|
~~~~~~
|
||||||
|
|
|
@ -76,6 +76,30 @@ class IndexTogetherTests(IsolatedModelsTestCase):
|
||||||
]
|
]
|
||||||
self.assertEqual(errors, expected)
|
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):
|
def test_pointing_to_m2m_field(self):
|
||||||
class Model(models.Model):
|
class Model(models.Model):
|
||||||
m2m = models.ManyToManyField('self')
|
m2m = models.ManyToManyField('self')
|
||||||
|
|
Loading…
Reference in New Issue