From ceea86baa36b91d0002911770340a2d7bd4f64b7 Mon Sep 17 00:00:00 2001 From: Jacob Walls Date: Sat, 4 May 2024 17:11:07 -0400 Subject: [PATCH] Fixed #35425 -- Avoided INSERT with force_update and explicit pk. Affected models where the primary key field is defined with a default or db_default, such as UUIDField. --- django/db/models/base.py | 1 + tests/basic/tests.py | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/django/db/models/base.py b/django/db/models/base.py index e68baf4e576..cd300e47bce 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -1088,6 +1088,7 @@ class Model(AltersData, metaclass=ModelBase): if ( not raw and not force_insert + and not force_update and self._state.adding and ( (meta.pk.default and meta.pk.default is not NOT_PROVIDED) diff --git a/tests/basic/tests.py b/tests/basic/tests.py index bda59d82fa8..38fb9ca2003 100644 --- a/tests/basic/tests.py +++ b/tests/basic/tests.py @@ -186,6 +186,12 @@ class ModelInstanceCreationTests(TestCase): with self.assertNumQueries(1): PrimaryKeyWithDefault().save() + def test_save_primary_with_default_force_update(self): + # An UPDATE attempt is made if explicitly requested. + obj = PrimaryKeyWithDefault.objects.create() + with self.assertNumQueries(1): + PrimaryKeyWithDefault(uuid=obj.pk).save(force_update=True) + def test_save_primary_with_db_default(self): # An UPDATE attempt is skipped when a primary key has db_default. with self.assertNumQueries(1):