Django 的软删除设计

Django 的软删除设计

Feb 23, 2017
Django

设计一个 Django 的软删除方案,要求数据库在删除的时候不能物理删除数据,同时尽量不要太侵入代码业务。

这里用到了 Django 的 Manager,它赋予了 Django Model 操作数据库的能力,每个 Model 都包含一个 Manager,比如我们常用的 objects 就是默认的 Manger。

这里我替换了默认的 manager,并重新实现了其 get_queryset 方法,这样在正常的查询中,统一过滤掉已经打上 deleted 标识的数据,当我们需要在数据结果中包含已删除的数据时,使用 all_objects,而不是 objects就可以了。

最后在自定义的业务 Model 中继承 AbstractTimeModel,就没有其他侵入式改动了。

from django.db import models
from django.utils import timezone


class ExcludeDeletedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(deleted_at__isnull=True)

class IncludeDeletedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset()
  
class AbstractTimeModel(models.Model):
    created_at = models.DateTimeField("创建时间", auto_now_add=True, null=True)
    updated_at = models.DateTimeField("更新时间", auto_now=True, null=True)
    deleted_at = models.DateTimeField("删除时间", blank=True, null=True)
    objects = ExcludeDeletedManager()
    all_objects = IncludeDeletedManager()
    
    def delete(self, using=None, keep_parents=False):
        self.deleted_at = timezone.now()
        self.save()
		
    class Meta:
        abstract = True
本文以 CC 署名-非商业性使用-禁止演绎 4.0 国际 协议进行许可。

上一篇:浅谈 Django-REST-Framework 的设计与源码

下一篇:数据库的 join 连接类型