基础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 = True
def delete(self, using=None, keep_parents=False):
self.deleted_at = timezone.now()
self.save()
实现这一套软删除过程之后可以保证在其他人调用model.objects.all/filter等返回queryset的方法时与硬删除过程完全相同.完全无需注意软删除的情况直接开发.