summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsarahboyce <sarahvboyce95@gmail.com>2022-09-29 20:19:38 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-09-29 20:32:08 +0200
commit1d77b931f7df96ec4d6fa3835fe35547397cca1a (patch)
tree8c8efc119c397133daef445169005462518581f7
parent9b0c9821ed4dd9920cc7c5e7b657720d91a89bdc (diff)
Refs #32095 -- Added model's Options._non_pk_concrete_field_names property.
-rw-r--r--django/db/models/base.py10
-rw-r--r--django/db/models/options.py14
2 files changed, 15 insertions, 9 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 1f7e5f84aa..cb51ed42c4 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -799,15 +799,7 @@ class Model(metaclass=ModelBase):
return
update_fields = frozenset(update_fields)
- field_names = set()
-
- for field in self._meta.concrete_fields:
- if not field.primary_key:
- field_names.add(field.name)
-
- if field.name != field.attname:
- field_names.add(field.attname)
-
+ field_names = self._meta._non_pk_concrete_field_names
non_model_fields = update_fields.difference(field_names)
if non_model_fields:
diff --git a/django/db/models/options.py b/django/db/models/options.py
index bff55011dc..b6b8202802 100644
--- a/django/db/models/options.py
+++ b/django/db/models/options.py
@@ -89,6 +89,7 @@ class Options:
"many_to_many",
"concrete_fields",
"local_concrete_fields",
+ "_non_pk_concrete_field_names",
"_forward_fields_map",
"managers",
"managers_map",
@@ -983,6 +984,19 @@ class Options:
return frozenset(names)
@cached_property
+ def _non_pk_concrete_field_names(self):
+ """
+ Return a set of the non-pk concrete field names defined on the model.
+ """
+ names = []
+ for field in self.concrete_fields:
+ if not field.primary_key:
+ names.append(field.name)
+ if field.name != field.attname:
+ names.append(field.attname)
+ return frozenset(names)
+
+ @cached_property
def db_returning_fields(self):
"""
Private API intended only to be used by Django itself.