MCPcopy
hub / github.com/django/django / __iter__

Method __iter__

django/db/models/query.py:91–163  ·  view source on GitHub ↗
(self)

Source from the content-addressed store, hash-verified

89 """Iterable that yields a model instance for each row."""
90
91 def __iter__(self):
92 queryset = self.queryset
93 db = queryset.db
94 compiler = queryset.query.get_compiler(using=db)
95 fetch_mode = queryset._fetch_mode
96 # Execute the query. This will also fill compiler.select, klass_info,
97 # and annotations.
98 results = compiler.execute_sql(
99 chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size
100 )
101 select, klass_info, annotation_col_map = (
102 compiler.select,
103 compiler.klass_info,
104 compiler.annotation_col_map,
105 )
106 model_cls = klass_info["model"]
107 select_fields = klass_info["select_fields"]
108 model_fields_start, model_fields_end = select_fields[0], select_fields[-1] + 1
109 init_list = [
110 f[0].target.attname for f in select[model_fields_start:model_fields_end]
111 ]
112 related_populators = get_related_populators(klass_info, select, db, fetch_mode)
113 known_related_objects = [
114 (
115 field,
116 related_objs,
117 attnames := [
118 (
119 field.attname
120 if from_field == "self"
121 else queryset.model._meta.get_field(from_field).attname
122 )
123 for from_field in field.from_fields
124 ],
125 operator.attrgetter(*attnames),
126 )
127 for field, related_objs in queryset._known_related_objects.items()
128 ]
129 peers = []
130 for row in compiler.results_iter(results):
131 obj = model_cls.from_db(
132 db,
133 init_list,
134 row[model_fields_start:model_fields_end],
135 fetch_mode=fetch_mode,
136 )
137 if fetch_mode.track_peers:
138 peers.append(weak_ref(obj))
139 obj._state.peers = peers
140 for rel_populator in related_populators:
141 rel_populator.populate(row, obj)
142 if annotation_col_map:
143 for attr_name, col_pos in annotation_col_map.items():
144 setattr(obj, attr_name, row[col_pos])
145
146 # Add the known related objects to the model.
147 for field, rel_objs, rel_attnames, rel_getter in known_related_objects:
148 # Avoid overwriting objects loaded by, e.g., select_related().

Callers

nothing calls this directly

Calls 10

get_related_populatorsFunction · 0.85
get_compilerMethod · 0.80
results_iterMethod · 0.80
from_dbMethod · 0.80
execute_sqlMethod · 0.45
get_fieldMethod · 0.45
itemsMethod · 0.45
appendMethod · 0.45
populateMethod · 0.45
is_cachedMethod · 0.45

Tested by

no test coverage detected