cache visited relations in iterating_models

This commit is contained in:
collerek
2021-09-11 11:18:52 +02:00
parent beb43dd76c
commit e5e0ff7b78

View File

@ -1,5 +1,6 @@
from typing import ( from typing import (
Callable, Callable,
Dict,
List, List,
Optional, Optional,
Set, Set,
@ -123,6 +124,7 @@ class RelationMixin:
def _iterate_related_models( # noqa: CCR001 def _iterate_related_models( # noqa: CCR001
cls, cls,
node_list: NodeList = None, node_list: NodeList = None,
parsed_map: Dict = None,
source_relation: str = None, source_relation: str = None,
recurrent: bool = False, recurrent: bool = False,
) -> List[str]: ) -> List[str]:
@ -137,11 +139,12 @@ class RelationMixin:
if cls.__relation_map__: if cls.__relation_map__:
return cls.__relation_map__ return cls.__relation_map__
node_list = NodeList() node_list = NodeList()
parsed_map = dict()
current_node = node_list.add(node_class=cls) current_node = node_list.add(node_class=cls)
else: else:
current_node = node_list[-1] current_node = node_list[-1]
relations = cls.extract_related_names() relations = sorted(cls.extract_related_names())
processed_relations = [] processed_relations: List[str] = []
for relation in relations: for relation in relations:
if not current_node.visited(relation): if not current_node.visited(relation):
target_model = cls.Meta.model_fields[relation].to target_model = cls.Meta.model_fields[relation].to
@ -150,9 +153,17 @@ class RelationMixin:
relation_name=relation, relation_name=relation,
parent_node=current_node, parent_node=current_node,
) )
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( deep_relations = target_model._iterate_related_models(
source_relation=relation, node_list=node_list, recurrent=True source_relation=relation,
node_list=node_list,
recurrent=True,
parsed_map=parsed_map,
) )
parsed_map[relation_key] = deep_relations
processed_relations.extend(deep_relations) processed_relations.extend(deep_relations)
result = cls._get_final_relations(processed_relations, source_relation) result = cls._get_final_relations(processed_relations, source_relation)