From b287af5dc954628d4b336aefc5027b2edceee64b Mon Sep 17 00:00:00 2001 From: Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:19:09 +0100 Subject: Fixed #35019 -- Fixed save() on models with both GeneratedFields and ForeignKeys. Thanks Deb Kumar Das for the report. Regression in f333e3513e8bdf5ffeb6eeb63021c230082e6f95. --- django/db/models/base.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'django') diff --git a/django/db/models/base.py b/django/db/models/base.py index 6eaa600f10..4a9150bf37 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -781,7 +781,11 @@ class Model(AltersData, metaclass=ModelBase): if force_insert and (force_update or update_fields): raise ValueError("Cannot force both insert and updating in model saving.") - deferred_fields = self.get_deferred_fields() + deferred_non_generated_fields = { + f.attname + for f in self._meta.concrete_fields + if f.attname not in self.__dict__ and f.generated is False + } if update_fields is not None: # If update_fields is empty, skip the save. We do also check for # no-op saves later on for inheritance cases. This bailout is @@ -802,12 +806,16 @@ class Model(AltersData, metaclass=ModelBase): # If saving to the same database, and this model is deferred, then # automatically do an "update_fields" save on the loaded fields. - elif not force_insert and deferred_fields and using == self._state.db: + elif ( + not force_insert + and deferred_non_generated_fields + and using == self._state.db + ): field_names = set() for field in self._meta.concrete_fields: if not field.primary_key and not hasattr(field, "through"): field_names.add(field.attname) - loaded_fields = field_names.difference(deferred_fields) + loaded_fields = field_names.difference(deferred_non_generated_fields) if loaded_fields: update_fields = frozenset(loaded_fields) -- cgit v1.3