Commit 0bcc92c6 authored by Marc Egli's avatar Marc Egli Committed by Simon Charette
Browse files

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

parent 17c18844
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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
~~~~~~
+24 −0
Original line number Diff line number Diff line
@@ -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')