cache visited relations in iterating_models
This commit is contained in:
@ -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,
|
||||||
)
|
)
|
||||||
deep_relations = target_model._iterate_related_models(
|
relation_key = f"{cls.get_name()}_{relation}"
|
||||||
source_relation=relation, node_list=node_list, recurrent=True
|
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)
|
processed_relations.extend(deep_relations)
|
||||||
|
|
||||||
result = cls._get_final_relations(processed_relations, source_relation)
|
result = cls._get_final_relations(processed_relations, source_relation)
|
||||||
|
|||||||
Reference in New Issue
Block a user