diff options
Diffstat (limited to 'django/db/models/query_utils.py')
| -rw-r--r-- | django/db/models/query_utils.py | 17 |
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: """ |
