django之自定义软删除Model的方法
软删除
简单的说,就是当执行删除操作的时候,不正真执行删除操作,而是在逻辑上删除一条记录。这样做的好处是可以统计数据,可以进行恢复操作等等。
预备知识
Managers
Managers是djangomodels提供的一个用于提供数据库查询操作的接口,对于Django应用程序中的每个model都会至少存在一个Manager
详细:https://docs.djangoproject.com/en/dev/topics/db/managers/
django实现软删除model
firstly,
fromdjango.dbimportmodels fromdjango.db.models.queryimportQuerySet #自定义软删除查询基类 classSoftDeletableQuerySetMixin(object): """ QuerySetforSoftDeletableModel.Insteadofremovinginstancesets its``is_deleted``fieldtoTrue. """ defdelete(self): """ Softdeleteobjectsfromqueryset(settheir``is_deleted`` fieldtoTrue) """ self.update(is_deleted=True) classSoftDeletableQuerySet(SoftDeletableQuerySetMixin,QuerySet): pass classSoftDeletableManagerMixin(object): """ Managerthatlimitsthequerysetbydefaulttoshowonlynotdeleted instancesofmodel. """ _queryset_class=SoftDeletableQuerySet defget_queryset(self): """ Returnquerysetlimitedtonotdeletedentries. """ kwargs={'model':self.model,'using':self._db} ifhasattr(self,'_hints'): kwargs['hints']=self._hints returnself._queryset_class(**kwargs).filter(is_deleted=False) classSoftDeletableManager(SoftDeletableManagerMixin,models.Manager): pass
secondly,
#自定义软删除抽象基类 classSoftDeletableModel(models.Model): """ Anabstractbaseclassmodelwitha``is_deleted``fieldthat marksentriesthatarenotgoingtobeusedanymore,butare keptindbforanyreason. Defaultmanagerreturnsonlynot-deletedentries. """ is_deleted=models.BooleanField(default=False) classMeta: abstract=True objects=SoftDeletableManager() defdelete(self,using=None,soft=True,*args,**kwargs): """ Softdeleteobject(setits``is_deleted``fieldtoTrue). Actuallydeleteobjectifsetting``soft``toFalse. """ ifsoft: self.is_deleted=True self.save(using=using) else: returnsuper(SoftDeletableModel,self).delete(using=using,*args,**kwargs) classCustomerInfo(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="公司名称")
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。