MCPcopy
hub / github.com/ormar-orm/ormar / RelationsManager

Class RelationsManager

ormar/relations/relation_manager.py:12–176  ·  view source on GitHub ↗

Manages relations on a Model, each Model has it's own instance.

Source from the content-addressed store, hash-verified

10
11
12class RelationsManager:
13 """
14 Manages relations on a Model, each Model has it's own instance.
15 """
16
17 def __init__(
18 self,
19 related_fields: Optional[list["ForeignKeyField"]] = None,
20 owner: Optional["Model"] = None,
21 ) -> None:
22 self.owner = proxy(owner)
23 self._related_fields = related_fields or []
24 # ``_field_map`` lets ``_get`` build a ``Relation`` lazily by name.
25 # Holding only the field reference (not a constructed Relation) is
26 # what skips the per-FK Relation/RelationProxy/QuerysetProxy
27 # allocation tree on every ``Model.__init__``.
28 self._field_map: dict[str, "ForeignKeyField"] = {
29 field.name: field for field in self._related_fields
30 }
31 self._related_names = list(self._field_map)
32 self._relations: dict[str, Relation] = dict()
33
34 def __contains__(self, item: str) -> bool:
35 """
36 Checks if relation with given name is already registered.
37
38 :param item: name of attribute
39 :type item: str
40 :return: result of the check
41 :rtype: bool
42 """
43 return item in self._related_names
44
45 def clear(self) -> None:
46 for relation in self._relations.values():
47 relation.clear()
48
49 def get(self, name: str) -> Optional[Union["Model", Sequence["Model"]]]:
50 """
51 Returns the related model/models if relation is set.
52 Actual call is delegated to Relation instance registered under relation name.
53
54 :param name: name of the relation
55 :type name: str
56 :return: related model or list of related models if set
57 :rtype: Optional[Union[Model, list[Model]]
58 """
59 relation = self._get(name)
60 if relation is not None:
61 return relation.get()
62 return None # pragma nocover
63
64 @staticmethod
65 def add(parent: "Model", child: "Model", field: "ForeignKeyField") -> None:
66 """
67 Adds relation on both sides -> meaning on both child and parent models.
68 One side of the relation is always weakref proxy to avoid circular refs.
69

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected