summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Fedoseev <fedoseev.sergey@gmail.com>2017-08-02 11:47:49 +0500
committerTim Graham <timograham@gmail.com>2017-08-07 18:55:13 -0400
commitba1d82df63a5cc49c4a472fc57acdb735c6fb66c (patch)
tree05ac5350e4956815cc97c6c2cbe650000e2c62f5
parent773c7888d44aa17d01a9ce59869aeb7b4c219da6 (diff)
Refs #28459 -- Improved performance of select_related() when model is prefetched from its parent.
-rw-r--r--django/db/models/query.py19
1 files changed, 4 insertions, 15 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 0b65bb56e8..1197661150 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -1665,21 +1665,10 @@ class RelatedPopulator:
]
self.reorder_for_init = None
else:
- model_init_attnames = [
- f.attname for f in klass_info['model']._meta.concrete_fields
- ]
- reorder_map = []
- for idx in select_fields:
- field = select[idx][0].target
- init_pos = model_init_attnames.index(field.attname)
- reorder_map.append((init_pos, field.attname, idx))
- reorder_map.sort()
- self.init_list = [v[1] for v in reorder_map]
- pos_list = [row_pos for _, _, row_pos in reorder_map]
-
- def reorder_for_init(row):
- return [row[row_pos] for row_pos in pos_list]
- self.reorder_for_init = reorder_for_init
+ attname_indexes = {select[idx][0].target.attname: idx for idx in select_fields}
+ model_init_attnames = (f.attname for f in klass_info['model']._meta.concrete_fields)
+ self.init_list = [attname for attname in model_init_attnames if attname in attname_indexes]
+ self.reorder_for_init = operator.itemgetter(*[attname_indexes[attname] for attname in self.init_list])
self.model_cls = klass_info['model']
self.pk_idx = self.init_list.index(self.model_cls._meta.pk.attname)