Loading django/db/models/base.py +9 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, Loading tests/invalid_models_tests/test_models.py +34 −0 Original line number Diff line number Diff line Loading @@ -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): Loading Loading
django/db/models/base.py +9 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, Loading
tests/invalid_models_tests/test_models.py +34 −0 Original line number Diff line number Diff line Loading @@ -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): Loading