django之自定义软删除Model的方法

时间:2021-05-22

软删除

简单的说,就是当执行删除操作的时候,不正真执行删除操作,而是在逻辑上删除一条记录。这样做的好处是可以统计数据,可以进行恢复操作等等。

预备知识

Managers

Managers 是django models 提供的一个用于提供数据库查询操作的接口,对于Django应用程序中的每个model都会至少存在一个Manager

详细:https://docs.djangoproject.com/en/dev/topics/db/managers/

django实现软删除model

firstly,

from django.db import modelsfrom django.db.models.query import QuerySet# 自定义软删除查询基类class SoftDeletableQuerySetMixin(object): """ QuerySet for SoftDeletableModel. Instead of removing instance sets its ``is_deleted`` field to True. """ def delete(self): """ Soft delete objects from queryset (set their ``is_deleted`` field to True) """ self.update(is_deleted=True)class SoftDeletableQuerySet(SoftDeletableQuerySetMixin, QuerySet): passclass SoftDeletableManagerMixin(object): """ Manager that limits the queryset by default to show only not deleted instances of model. """ _queryset_class = SoftDeletableQuerySet def get_queryset(self): """ Return queryset limited to not deleted entries. """ kwargs = {'model': self.model, 'using': self._db} if hasattr(self, '_hints'): kwargs['hints'] = self._hints return self._queryset_class(**kwargs).filter(is_deleted=False)class SoftDeletableManager(SoftDeletableManagerMixin, models.Manager): pass

secondly,

# 自定义软删除抽象基类class SoftDeletableModel(models.Model): """ An abstract base class model with a ``is_deleted`` field that marks entries that are not going to be used anymore, but are kept in db for any reason. Default manager returns only not-deleted entries. """ is_deleted = models.BooleanField(default=False) class Meta: abstract = True objects = SoftDeletableManager() def delete(self, using=None, soft=True, *args, **kwargs): """ Soft delete object (set its ``is_deleted`` field to True). Actually delete object if setting ``soft`` to False. """ if soft: self.is_deleted = True self.save(using=using) else: return super(SoftDeletableModel, self).delete(using=using, *args, **kwargs)class CustomerInfo(SoftDeletableModel): nid = models.AutoField(primary_key=True) category = models.ForeignKey("CustomerCategory", to_field="nid", on_delete=models.CASCADE, verbose_name='客户分类', db_constraint=False) company = models.CharField(max_length=64, verbose_name="公司名称")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章