summaryrefslogtreecommitdiff
path: root/django/db/models/query_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/db/models/query_utils.py')
-rw-r--r--django/db/models/query_utils.py17
1 files changed, 16 insertions, 1 deletions
diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py
index c383b80640..23d543211a 100644
--- a/django/db/models/query_utils.py
+++ b/django/db/models/query_utils.py
@@ -264,7 +264,8 @@ class DeferredAttribute:
f"Cannot retrieve deferred field {field_name!r} "
"from an unsaved model."
)
- instance.refresh_from_db(fields=[field_name])
+
+ instance._state.fetch_mode.fetch(self, instance)
else:
data[field_name] = val
return data[field_name]
@@ -281,6 +282,20 @@ class DeferredAttribute:
return getattr(instance, link_field.attname)
return None
+ def fetch_one(self, instance):
+ instance.refresh_from_db(fields=[self.field.attname])
+
+ def fetch_many(self, instances):
+ attname = self.field.attname
+ db = instances[0]._state.db
+ value_by_pk = (
+ self.field.model._base_manager.using(db)
+ .values_list(attname)
+ .in_bulk({i.pk for i in instances})
+ )
+ for instance in instances:
+ setattr(instance, attname, value_by_pk[instance.pk])
+
class class_or_instance_method:
"""