Пример #1
0
    async def clear(self, keep_reversed: bool = True) -> int:
        """
        Removes all related models from given relation.

        Removes all through models for m2m relation.

        For reverse FK relations keep_reversed flag marks if the reversed models
        should be kept or deleted from the database too (False means that models
        will be deleted, and not only removed from relation).

        :param keep_reversed: flag if reverse models in reverse FK should be deleted
        or not, keep_reversed=False deletes them from database.
        :type keep_reversed: bool
        :return: number of deleted models
        :rtype: int
        """
        if self.type_ == ormar.RelationType.MULTIPLE:
            queryset = ormar.QuerySet(
                model_cls=self.relation.through)  # type: ignore
            owner_column = self._owner.get_name()
        else:
            queryset = ormar.QuerySet(
                model_cls=self.relation.to)  # type: ignore
            owner_column = self.related_field.name
        kwargs = {owner_column: self._owner}
        self._clean_items_on_load()
        if keep_reversed and self.type_ == ormar.RelationType.REVERSE:
            update_kwrgs = {f"{owner_column}": None}
            return await queryset.filter(_exclude=False,
                                         **kwargs).update(each=False,
                                                          **update_kwrgs)
        return await queryset.delete(**kwargs)  # type: ignore
Пример #2
0
 async def clear(self, keep_reversed: bool = True) -> int:
     if self.type_ == ormar.RelationType.MULTIPLE:
         queryset = ormar.QuerySet(model_cls=self.relation.through)
         owner_column = self._owner.get_name()
     else:
         queryset = ormar.QuerySet(model_cls=self.relation.to)
         owner_column = self.related_field.name
     kwargs = {owner_column: self._owner}
     self._clean_items_on_load()
     if keep_reversed and self.type_ == ormar.RelationType.REVERSE:
         update_kwrgs = {f"{owner_column}": None}
         return await queryset.filter(_exclude=False,
                                      **kwargs).update(each=False,
                                                       **update_kwrgs)
     return await queryset.delete(**kwargs)  # type: ignore
Пример #3
0
 async def delete_through_instance(self, child: "T") -> None:
     queryset = ormar.QuerySet(model_cls=self.relation.through)
     owner_column = self._owner.get_name()
     child_column = child.get_name()
     kwargs = {owner_column: self._owner, child_column: child}
     link_instance = await queryset.filter(**kwargs).get()  # type: ignore
     await link_instance.delete()
Пример #4
0
 def _set_queryset(self) -> "QuerySet":
     related_field_name = self.related_field_name
     related_field = self.relation.to.Meta.model_fields[related_field_name]
     pkname = self._owner.get_column_alias(self._owner.Meta.pkname)
     self._check_if_model_saved()
     kwargs = {f"{related_field.get_alias()}__{pkname}": self._owner.pk}
     queryset = (
         ormar.QuerySet(model_cls=self.relation.to)
         .select_related(related_field.name)
         .filter(**kwargs)
     )
     return queryset
Пример #5
0
    async def delete_through_instance(self, child: "T") -> None:
        """
        Removes through model instance from the database for m2m relations.

        :param child: child model instance
        :type child: Model
        """
        queryset = ormar.QuerySet(model_cls=self.relation.through)
        owner_column = self.related_field.default_target_field_name()  # type: ignore
        child_column = self.related_field.default_source_field_name()  # type: ignore
        kwargs = {owner_column: self._owner, child_column: child}
        link_instance = await queryset.filter(**kwargs).get()  # type: ignore
        await link_instance.delete()
Пример #6
0
 def _set_queryset(self) -> "QuerySet":
     owner_table = self.relation._owner.Meta.tablename
     pkname = self.relation._owner.get_column_alias(self.relation._owner.Meta.pkname)
     pk_value = self.relation._owner.pk
     if not pk_value:
         raise RelationshipInstanceError(
             "You cannot query many to many relationship on unsaved model."
         )
     kwargs = {f"{owner_table}__{pkname}": pk_value}
     queryset = (
         ormar.QuerySet(model_cls=self.relation.to)
         .select_related(owner_table)
         .filter(**kwargs)
     )
     return queryset
Пример #7
0
    def _set_queryset(self) -> "QuerySet":
        """
        Creates new QuerySet with relation model and pre filters it with currents
        parent model primary key, so all queries by definition are already related
        to the parent model only, without need for user to filter them.

        :return: initialized QuerySet
        :rtype: QuerySet
        """
        related_field_name = self.related_field_name
        related_field = self.relation.to.Meta.model_fields[related_field_name]
        pkname = self._owner.get_column_alias(self._owner.Meta.pkname)
        self._check_if_model_saved()
        kwargs = {f"{related_field.get_alias()}__{pkname}": self._owner.pk}
        queryset = (ormar.QuerySet(model_cls=self.relation.to).select_related(
            related_field.name).filter(**kwargs))
        return queryset
Пример #8
0
 async def create_through_instance(self, child: "T") -> None:
     queryset = ormar.QuerySet(model_cls=self.relation.through)
     owner_column = self._owner.get_name()
     child_column = child.get_name()
     kwargs = {owner_column: self._owner, child_column: child}
     await queryset.create(**kwargs)
Пример #9
0
 async def clear(self) -> int:
     queryset = ormar.QuerySet(model_cls=self.relation.through)
     owner_column = self.relation._owner.get_name()
     kwargs = {owner_column: self.relation._owner}
     return await queryset.delete(**kwargs)  # type: ignore