Django中的软删除

软删除(Soft Delete)是一种数据删除策略,它并不真正从数据库中删除记录,而是通过标记(如 is_deleted 字段)来表示记录已被删除。

这样做的好处是可以保留数据历史,支持数据恢复和审计。

在 Django 里可以通过 自定义 Manager + 重写 delete 方法 来实现。


1. 在模型里增加 is_delete 字段

python 复制代码
from django.db import models

class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False, verbose_name="是否删除")

    class Meta:
        abstract = True  # 抽象基类,不会建表

这样所有继承 BaseModel 的表都有 is_delete 字段。


2. 自定义 Manager(默认过滤掉删除的记录)

python 复制代码
class ActiveManager(models.Manager):
    def get_queryset(self):
        # 默认只返回 is_delete=False 的数据
        return super().get_queryset().filter(is_delete=False)

3. 在模型里应用 Manager

python 复制代码
class User(BaseModel):
    name = models.CharField(max_length=100)

    # managers
    objects = ActiveManager()   # 默认只取未删除的
    all_objects = models.Manager()  # 需要时可以取所有(包括已删除的)

这样:

python 复制代码
User.objects.all()        # 只会查 is_delete=False
User.all_objects.all()    # 不加过滤,所有数据都能查

4. 重写 delete() 方法(软删除)

python 复制代码
class User(BaseModel):
    name = models.CharField(max_length=100)

    objects = ActiveManager()
    all_objects = models.Manager()

    def delete(self, using=None, keep_parents=False):
        self.is_delete = True
        self.save(update_fields=['is_delete'])  # 只更新 is_delete 字段

这样:

python 复制代码
u = User.objects.get(id=1)
u.delete()  # 不会真正删除,只会把 is_delete 置为 True

5. 如果要做批量删除

Django 的 QuerySet.delete() 默认会直接删掉数据,所以我们也可以自定义一个 QuerySet 来支持批量软删除:

python 复制代码
class SoftDeleteQuerySet(models.QuerySet):
    def delete(self):
        return super().update(is_delete=True)

结合 Manager 使用:

python 复制代码
class ActiveManager(models.Manager):
    def get_queryset(self):
        return SoftDeleteQuerySet(self.model, using=self._db).filter(is_delete=False)

这样就支持:

python 复制代码
User.objects.filter(name="Tom").delete()  # 也会变成软删除

总结

  1. is_delete 字段标记是否删除。
  2. 自定义 Manager 过滤掉已删除的数据。
  3. 重写 delete() 实现软删除逻辑。
  4. 如有需要,配合自定义 QuerySet 处理批量软删除。
相关推荐
weixin199701080162 小时前
[特殊字符]《从0到1:闲鱼开放平台授权登录 + AccessToken 刷新 + 聚石塔部署完整链路》(附Python源码)
java·数据库·python
cmes_love2 小时前
国内期货Level2五档行情与逐笔成交数据介绍
数据库·区块链
cmes_love3 小时前
CME和CBOT外盘期货数据下载资源介绍
数据库·区块链
Zenova EdgeOS3 小时前
工业边缘双写一致性:从缓存到多 DB 的工程实战
数据库·缓存·边缘计算·工业边缘
志栋智能3 小时前
运维不再“猜谜”:自动化定界终结无效排查
运维·数据库·自动化
职场的momo3 小时前
16384个槽怎么搬?解析Redis集群迁移与脑裂防御
数据库·redis·缓存
隔窗听雨眠3 小时前
异构数据库迁移至南大通用GBase 8a完全指南:从调研到双轨切换的实战路径
数据库
CNSSIRD数据库3 小时前
中国企业海关信用数据库
大数据·数据库·数据分析·论文笔记
算法大模型备案干货咪3 小时前
《大模型备案工程实操:语料标注规则、关键词拦截列表与测试题集的设计》
数据库·人工智能
Elastic 中国社区官方博客4 小时前
安装 Elasticsearch
大数据·数据库·elasticsearch·搜索引擎·全文检索