软删除相关的内容.

基础queryset:

注意queryset.update,queryset.delete等方法不会调用到model中的save/update/delete等方法.
这里重写了queryset的delete方法来保证调用queryset.delete()时,行为仍然是软删除.

  1. class BaseQuerySet(models.QuerySet):
  2. def delete(self):
  3. return super(BaseQuerySet, self).update(deleted_at=timezone.now())

基础manager:

通过manager指定自定义的queryset

  1. class BaseManager(models.Manager):
  2. def __init__(self, *args, **kwargs):
  3. self.alive_only = kwargs.pop('alive_only', True)
  4. super(BaseManager, self).__init__(*args, **kwargs)
  5. def get_queryset(self):
  6. if self.alive_only:
  7. return BaseQuerySet(self.model).filter(deleted_at=None)
  8. return BaseQuerySet(self.model)

基础模型类:

这里是通过deleted_at来作为软删除标记的.也可以使用一个布尔值.
重写objects属性来保证manager类是我们自定义的.
提供all_objects属性来获取全部数据.

  1. class BaseModel(models.Model):
  2. created_at = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
  3. updated_at = models.DateTimeField(verbose_name='更新时间', auto_now=True)
  4. deleted_at = models.DateTimeField(blank=True, null=True)
  5. objects = BaseManager()
  6. all_objects = BaseManager(alive_only=False)
  7. class Meta:
  8. abstract = True
  9. def delete(self, using=None, keep_parents=False):
  10. self.deleted_at = timezone.now()
  11. self.save()

实现这一套软删除过程之后可以保证在其他人调用model.objects.all/filter等返回queryset的方法时与硬删除过程完全相同.完全无需注意软删除的情况直接开发.