summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
Diffstat (limited to 'django')
-rw-r--r--django/db/models/base.py14
1 files changed, 11 insertions, 3 deletions
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)