예제 #1
0
파일: relation.py 프로젝트: mbeacom/ormar
    def __init__(
        self,
        manager: "RelationsManager",
        type_: RelationType,
        field_name: str,
        to: Type["T"],
        through: Type["T"] = None,
    ) -> None:
        """
        Initialize the Relation and keep the related models either as instances of
        passed Model, or as a RelationProxy which is basically a list of models with
        some special behavior, as it exposes QuerySetProxy and allows querying the
        related models already pre filtered by parent model.

        :param manager: reference to relation manager
        :type manager: RelationsManager
        :param type_: type of the relation
        :type type_: RelationType
        :param field_name: name of the relation field
        :type field_name: str
        :param to: model to which relation leads to
        :type to: Type[Model]
        :param through: model through which relation goes for m2m relations
        :type through: Type[Model]
        """
        self.manager = manager
        self._owner: "Model" = manager.owner
        self._type: RelationType = type_
        self._to_remove: Set = set()
        self.to: Type["T"] = to
        self._through: Optional[Type["T"]] = through
        self.field_name: str = field_name
        self.related_models: Optional[Union[RelationProxy, "T"]] = (
            RelationProxy(relation=self, type_=type_, field_name=field_name) if
            type_ in (RelationType.REVERSE, RelationType.MULTIPLE) else None)
예제 #2
0
 def _clean_related(self) -> None:
     cleaned_data = [
         x for i, x in enumerate(self.related_models)  # type: ignore
         if i not in self._to_remove
     ]
     self.related_models = RelationProxy(
         relation=self,
         type_=self._type,
         field_name=self.field_name,
         data_=cleaned_data,
     )
     relation_name = self._owner.resolve_relation_name(self._owner, self.to)
     self._owner.__dict__[relation_name] = cleaned_data
     self._to_remove = set()
예제 #3
0
 def __init__(
     self,
     manager: "RelationsManager",
     type_: RelationType,
     to: Type["T"],
     through: Type["T"] = None,
 ) -> None:
     self.manager = manager
     self._owner: "Model" = manager.owner
     self._type: RelationType = type_
     self.to: Type["T"] = to
     self.through: Optional[Type["T"]] = through
     self.related_models: Optional[Union[RelationProxy, "T"]] = (
         RelationProxy(
             relation=self) if type_ in (RelationType.REVERSE,
                                         RelationType.MULTIPLE) else None)
예제 #4
0
파일: relation.py 프로젝트: mbeacom/ormar
 def _clean_related(self) -> None:
     """
     Removes dead weakrefs from RelationProxy.
     """
     cleaned_data = [
         x for i, x in enumerate(self.related_models)  # type: ignore
         if i not in self._to_remove
     ]
     self.related_models = RelationProxy(
         relation=self,
         type_=self._type,
         field_name=self.field_name,
         data_=cleaned_data,
     )
     relation_name = self.field_name
     self._owner.__dict__[relation_name] = cleaned_data
     self._to_remove = set()