Django 自定义软删除Model
起源:
一些数据不会真的去删除,而是给数据标记一个flag,表示它被删除了,然后感觉每次都写一个这样的字段超级麻烦,并且有时候给筛选的时候一不小心的疏漏可能导致被删除的实例重新回到列表中。。。# [编码中还是总充满这小惊喜的哈]
,因此打算实现一个可以软删除的Model,这样每次需要软删除就方便多了。
测试环境:Django2.0 Python3.6
在这里多说一句哈,个人比较喜欢3.6的格式化字符串语法,作为一个懒虫,能省掉一个format,何乐而不为哈
具体实现:
首先,先写一个model,当然,在这之前如果不熟悉Managers的话,建议先看一下官方文档Manager , 因为要自己处理一下那个标记,在这里用到了Managers。
话不多说了,直接上代码
class SoftDeletableQuerySet(QuerySet):
def delete(self):
self.update(is_deleted=True)
class SoftDeletableManager(models.Manager):
"""
仅返回未被删除的实例
"""
_queryset_class = SoftDeletableQuerySet
def get_queryset(self):
"""
在这里处理一下QuerySet, 然后返回没被标记位is_deleted的QuerySet
"""
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 SoftDeletableModel(models.Model):
"""
抽象类,添加is_deleted 字段
"""
is_deleted = models.BooleanField(default=False)
class Meta:
abstract = True
objects = SoftDeletableManager()
def delete(self, using=None, soft=True, *args, **kwargs):
"""
这里需要真删除的话soft=False即可
"""
if soft:
self.is_deleted = True
self.save(using=using)
else:
return super(SoftDeletableModel, self).delete(using=using, *args, **kwargs)
在这里我用的is_deleted字段,大家可以自己换成自己喜欢的字段,由于要保证接口统一性,我所有的删除字段都用的它哈。
然后其他的model 继承他就好了一个简单的demo
class SoftDeletableModelDemo(SoftDeletableModel):
key = models.CharField(max_length=32, blank=True)
class Meta:
db_table = 'soft_deletable_model_demo'
好了,实现软删除到这里就结束了,有问题欢迎大家斧正哈,小白敬上^o^。