(self)
| 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(). |
nothing calls this directly
no test coverage detected