Browse Source

Fixed #26827 -- Improved ModelState error message when relations refer model classes.

Prashant Pandey 1 year ago
parent
commit
a8adb6aa6c
3 changed files with 11 additions and 8 deletions
  1. 1 0
      AUTHORS
  2. 6 4
      django/db/migrations/state.py
  3. 4 4
      tests/migrations/test_state.py

+ 1 - 0
AUTHORS

@@ -816,6 +816,7 @@ answer newbie questions, and generally made Django that much better:
     plisk
     polpak@yahoo.com
     pradeep.gowda@gmail.com
+    Prashant Pandey <https://prashantpandey9.in>
     Preston Holmes <preston@ptone.com>
     Preston Timmons <prestontimmons@gmail.com>
     Priyank Panchal <priyankpanchal872000@gmail.com>

+ 6 - 4
django/db/migrations/state.py

@@ -738,13 +738,15 @@ class ModelState:
             # Sanity-check that relation fields are NOT referring to a model class.
             if field.is_relation and hasattr(field.related_model, "_meta"):
                 raise ValueError(
-                    'ModelState.fields cannot refer to a model class - "%s.to" does. '
-                    "Use a string reference instead." % name
+                    'Model fields in "ModelState.fields" cannot refer to a model class '
+                    f'- "{self.app_label}.{self.name}.{name}.to" does. Use a string '
+                    "reference instead."
                 )
             if field.many_to_many and hasattr(field.remote_field.through, "_meta"):
                 raise ValueError(
-                    'ModelState.fields cannot refer to a model class - "%s.through" '
-                    "does. Use a string reference instead." % name
+                    'Model fields in "ModelState.fields" cannot refer to a model class '
+                    f'- "{self.app_label}.{self.name}.{name}.through" does. Use a '
+                    "string reference instead."
                 )
         # Sanity-check that indexes have their name set.
         for index in self.options["indexes"]:

+ 4 - 4
tests/migrations/test_state.py

@@ -1651,8 +1651,8 @@ class ModelStateTests(SimpleTestCase):
         field = models.ForeignKey(UnicodeModel, models.CASCADE)
         with self.assertRaisesMessage(
             ValueError,
-            'ModelState.fields cannot refer to a model class - "field.to" does. '
-            "Use a string reference instead.",
+            'Model fields in "ModelState.fields" cannot refer to a model class - '
+            '"app.Model.field.to" does. Use a string reference instead.',
         ):
             ModelState("app", "Model", [("field", field)])
 
@@ -1661,8 +1661,8 @@ class ModelStateTests(SimpleTestCase):
         field.remote_field.through = UnicodeModel
         with self.assertRaisesMessage(
             ValueError,
-            'ModelState.fields cannot refer to a model class - "field.through" does. '
-            "Use a string reference instead.",
+            'Model fields in "ModelState.fields" cannot refer to a model class - '
+            '"app.Model.field.through" does. Use a string reference instead.',
         ):
             ModelState("app", "Model", [("field", field)])