summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Egli <frog32@me.com>2014-04-14 14:41:47 -0400
committerSimon Charette <charette.s@gmail.com>2014-04-14 16:49:40 -0400
commit0bcc92c6917738caa2f08ec16d26fad62974fb47 (patch)
treee144e332202a3b63b623bc05716fcb522028ffb3
parent17c18844561431aabed89c3bd48de951db7d13ab (diff)
Fixed #22356 -- Added a check to make sure unique_together fields are local.
-rw-r--r--django/db/models/base.py13
-rw-r--r--docs/ref/checks.txt1
-rw-r--r--tests/invalid_models_tests/test_models.py24
3 files changed, 38 insertions, 0 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 589d793627..b978d9ebdf 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -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
diff --git a/docs/ref/checks.txt b/docs/ref/checks.txt
index 98a6e00e73..67dc335d80 100644
--- a/docs/ref/checks.txt
+++ b/docs/ref/checks.txt
@@ -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
~~~~~~
diff --git a/tests/invalid_models_tests/test_models.py b/tests/invalid_models_tests/test_models.py
index e090ade34b..1338fcabcd 100644
--- a/tests/invalid_models_tests/test_models.py
+++ b/tests/invalid_models_tests/test_models.py
@@ -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')