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="公司名称")
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。