Commit d04e7302 authored by Vincent-Vega's avatar Vincent-Vega Committed by Simon Charette
Browse files

Fixed #22711 -- Adjusted ordering checks to allow implicit relation fields.

refs #19195.
parent 7a38f889
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -1357,7 +1357,7 @@ class Model(six.with_metaclass(ModelBase)):

    @classmethod
    def _check_ordering(cls):
        """ Check "ordering" option -- is it a list of lists and do all fields
        """ Check "ordering" option -- is it a list of strings and do all fields
        exist? """

        from django.db.models import FieldDoesNotExist
@@ -1401,6 +1401,14 @@ class Model(six.with_metaclass(ModelBase)):
            try:
                cls._meta.get_field(field_name, many_to_many=False)
            except FieldDoesNotExist:
                if field_name.endswith('_id'):
                    try:
                        field = cls._meta.get_field(field_name[:-3], many_to_many=False)
                    except FieldDoesNotExist:
                        pass
                    else:
                        if field.attname == field_name:
                            continue
                errors.append(
                    checks.Error(
                        "'ordering' refers to the non-existent field '%s'." % field_name,
+34 −0
Original line number Diff line number Diff line
@@ -415,6 +415,40 @@ class OtherModelTests(IsolatedModelsTestCase):
        ]
        self.assertEqual(errors, expected)

    def test_ordering_pointing_to_missing_foreignkey_field(self):
        # refs #22711

        class Model(models.Model):
            missing_fk_field = models.IntegerField()

            class Meta:
                ordering = ("missing_fk_field_id",)

        errors = Model.check()
        expected = [
            Error(
                "'ordering' refers to the non-existent field 'missing_fk_field_id'.",
                hint=None,
                obj=Model,
                id='models.E015',
            )
        ]
        self.assertEqual(errors, expected)

    def test_ordering_pointing_to_existing_foreignkey_field(self):
        # refs #22711

        class Parent(models.Model):
            pass

        class Child(models.Model):
            parent = models.ForeignKey(Parent)

            class Meta:
                ordering = ("parent_id",)

        self.assertFalse(Child.check())

    @override_settings(TEST_SWAPPED_MODEL_BAD_VALUE='not-a-model')
    def test_swappable_missing_app_name(self):
        class Model(models.Model):