基础queryset:
注意queryset.update,queryset.delete等方法不会调用到model中的save/update/delete等方法.
这里重写了queryset的delete方法来保证调用queryset.delete()时,行为仍然是软删除.
class BaseQuerySet(models.QuerySet):def delete(self):return super(BaseQuerySet, self).update(deleted_at=timezone.now())
基础manager:
通过manager指定自定义的queryset
class BaseManager(models.Manager):def __init__(self, *args, **kwargs):self.alive_only = kwargs.pop('alive_only', True)super(BaseManager, self).__init__(*args, **kwargs)def get_queryset(self):if self.alive_only:return BaseQuerySet(self.model).filter(deleted_at=None)return BaseQuerySet(self.model)
基础模型类:
这里是通过deleted_at来作为软删除标记的.也可以使用一个布尔值.
重写objects属性来保证manager类是我们自定义的.
提供all_objects属性来获取全部数据.
class BaseModel(models.Model):created_at = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)updated_at = models.DateTimeField(verbose_name='更新时间', auto_now=True)deleted_at = models.DateTimeField(blank=True, null=True)objects = BaseManager()all_objects = BaseManager(alive_only=False)class Meta:abstract = Truedef delete(self, using=None, keep_parents=False):self.deleted_at = timezone.now()self.save()
实现这一套软删除过程之后可以保证在其他人调用model.objects.all/filter等返回queryset的方法时与硬删除过程完全相同.完全无需注意软删除的情况直接开发.
