diff --git a/django/db/models/base.py b/django/db/models/base.py index 34fb0ab0b4..b223764879 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -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, diff --git a/tests/invalid_models_tests/test_models.py b/tests/invalid_models_tests/test_models.py index 1338fcabcd..9cbaa8449c 100644 --- a/tests/invalid_models_tests/test_models.py +++ b/tests/invalid_models_tests/test_models.py @@ -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):