From e5e0ff7b78e1d9aa0e68943882570e1e603dd46f Mon Sep 17 00:00:00 2001 From: collerek Date: Sat, 11 Sep 2021 11:18:52 +0200 Subject: [PATCH] cache visited relations in iterating_models --- ormar/models/mixins/relation_mixin.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/ormar/models/mixins/relation_mixin.py b/ormar/models/mixins/relation_mixin.py index 97df67e..3676226 100644 --- a/ormar/models/mixins/relation_mixin.py +++ b/ormar/models/mixins/relation_mixin.py @@ -1,5 +1,6 @@ from typing import ( Callable, + Dict, List, Optional, Set, @@ -123,6 +124,7 @@ class RelationMixin: def _iterate_related_models( # noqa: CCR001 cls, node_list: NodeList = None, + parsed_map: Dict = None, source_relation: str = None, recurrent: bool = False, ) -> List[str]: @@ -137,11 +139,12 @@ class RelationMixin: if cls.__relation_map__: return cls.__relation_map__ node_list = NodeList() + parsed_map = dict() current_node = node_list.add(node_class=cls) else: current_node = node_list[-1] - relations = cls.extract_related_names() - processed_relations = [] + relations = sorted(cls.extract_related_names()) + processed_relations: List[str] = [] for relation in relations: if not current_node.visited(relation): target_model = cls.Meta.model_fields[relation].to @@ -150,9 +153,17 @@ class RelationMixin: relation_name=relation, parent_node=current_node, ) - deep_relations = target_model._iterate_related_models( - source_relation=relation, node_list=node_list, recurrent=True - ) + relation_key = f"{cls.get_name()}_{relation}" + parsed_map = cast(Dict, parsed_map) + deep_relations = parsed_map.get(relation_key) + if not deep_relations: + deep_relations = target_model._iterate_related_models( + source_relation=relation, + node_list=node_list, + recurrent=True, + parsed_map=parsed_map, + ) + parsed_map[relation_key] = deep_relations processed_relations.extend(deep_relations) result = cls._get_final_relations(processed_relations, source_relation)