软删除
简单的说,就是当执行删除操作的时候,不正真执行删除操作,而是在逻辑上删除一条记录。这样做的好处是可以统计数据,可以进行恢复操作等等。
预备知识
Managers
Managers 是django models 提供的一个用于提供数据库查询操作的接口,对于Django应用程序中的每个model都会至少存在一个Manager
详细:https://docs.djangoproject.com/en/dev/topics/db/managers/
django实现软删除model
firstly,
- from django.db import models
- from 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):
- pass
-
-
- class 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="公司名称")
-
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。