2
0
Эх сурвалжийг харах

Fixed #22640 -- Raised TypeError when instantiating model with keyword and positional args for the same field.

Jacob Walls 4 жил өмнө
parent
commit
73b1b225ce

+ 5 - 1
django/db/models/base.py

@@ -442,7 +442,11 @@ class Model(metaclass=ModelBase):
                 if val is _DEFERRED:
                     continue
                 _setattr(self, field.attname, val)
-                kwargs.pop(field.name, None)
+                if kwargs.pop(field.name, NOT_PROVIDED) is not NOT_PROVIDED:
+                    raise TypeError(
+                        f"{cls.__qualname__}() got both positional and "
+                        f"keyword arguments for field '{field.name}'."
+                    )
 
         # Now we're left with the unprocessed fields that *must* come from
         # keywords, or default.

+ 9 - 0
tests/basic/tests.py

@@ -68,6 +68,15 @@ class ModelInstanceCreationTests(TestCase):
         a.save()
         self.assertEqual(a.headline, 'Fourth article')
 
+    def test_positional_and_keyword_args_for_the_same_field(self):
+        msg = "Article() got both positional and keyword arguments for field '%s'."
+        with self.assertRaisesMessage(TypeError, msg % 'headline'):
+            Article(None, 'Fifth article', headline='Other headline.')
+        with self.assertRaisesMessage(TypeError, msg % 'headline'):
+            Article(None, 'Sixth article', headline='')
+        with self.assertRaisesMessage(TypeError, msg % 'pub_date'):
+            Article(None, 'Seventh article', datetime(2021, 3, 1), pub_date=None)
+
     def test_cannot_create_instance_with_invalid_kwargs(self):
         with self.assertRaisesMessage(TypeError, "Article() got an unexpected keyword argument 'foo'"):
             Article(