Fixed #22356 -- Added a check to make sure unique_together fields are local.

This commit is contained in:
Marc Egli 2014-04-14 14:41:47 -04:00 committed by Simon Charette
parent 17c1884456
commit 0bcc92c691
3 changed files with 38 additions and 0 deletions

View File

@ -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

View File

@ -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
~~~~~~ ~~~~~~

View File

@ -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')