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
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
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()
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
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()
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
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
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)
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