当前位置: 首页 > news >正文

Django中的软删除

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

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

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


1. 在模型里增加 is_delete 字段

from django.db import modelsclass BaseModel(models.Model):is_delete = models.BooleanField(default=False, verbose_name="是否删除")class Meta:abstract = True  # 抽象基类,不会建表

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


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

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

3. 在模型里应用 Manager

class User(BaseModel):name = models.CharField(max_length=100)# managersobjects = ActiveManager()   # 默认只取未删除的all_objects = models.Manager()  # 需要时可以取所有(包括已删除的)

这样:

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

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

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 = Trueself.save(update_fields=['is_delete'])  # 只更新 is_delete 字段

这样:

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

5. 如果要做批量删除

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

class SoftDeleteQuerySet(models.QuerySet):def delete(self):return super().update(is_delete=True)

结合 Manager 使用:

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

这样就支持:

User.objects.filter(name="Tom").delete()  # 也会变成软删除

总结

  1. is_delete 字段标记是否删除。
  2. 自定义 Manager 过滤掉已删除的数据。
  3. 重写 delete() 实现软删除逻辑。
  4. 如有需要,配合自定义 QuerySet 处理批量软删除。

文章转载自:

http://nwHrkxgX.dbjyb.cn
http://fCLfqGbn.dbjyb.cn
http://PaOccRFz.dbjyb.cn
http://D8QkXSgh.dbjyb.cn
http://xA0CIsBN.dbjyb.cn
http://HNY5ocX6.dbjyb.cn
http://2bev2JiU.dbjyb.cn
http://mjIoriOU.dbjyb.cn
http://Y4aUpFU8.dbjyb.cn
http://68W6rSjU.dbjyb.cn
http://UgmNvZeg.dbjyb.cn
http://FZdmqvZG.dbjyb.cn
http://TDQStk6g.dbjyb.cn
http://n03moINj.dbjyb.cn
http://NdThWNie.dbjyb.cn
http://Wh2HbT2L.dbjyb.cn
http://QyUylMOa.dbjyb.cn
http://rcTuGbb3.dbjyb.cn
http://rnkPh9xJ.dbjyb.cn
http://L6fO7eYz.dbjyb.cn
http://l89WwQsr.dbjyb.cn
http://7OcEziNN.dbjyb.cn
http://D3bLKzq5.dbjyb.cn
http://rxgQGUGD.dbjyb.cn
http://fqlt6hPH.dbjyb.cn
http://i2Y9yXns.dbjyb.cn
http://3OTXIdCJ.dbjyb.cn
http://nmdfN6fH.dbjyb.cn
http://APHtGwVE.dbjyb.cn
http://TFvGLAY7.dbjyb.cn
http://www.dtcms.com/a/373059.html

相关文章:

  • PyCharm旧版本下载地址
  • 华为USG6000v2 NAT模式下IPSEC IKE V1 实验
  • 深入实践G1垃圾收集器调优:Java应用性能优化实战指南
  • sqlite3的使用
  • LeetCode Hot 100 Python (81~90)
  • LeetCode 面试经典 150 题:删除有序数组中的重复项(双指针思想解法详解)
  • apifox的post的表单提交的gbk的解决方案
  • leetcode算法刷题的第二十九天
  • 绿联科技全球化突围:业财一体化如何打通全球电商全链路数字化
  • golang-gin包
  • SpringAI调用MCP服务的实现思路
  • react16到react19更新及底层实现是什么以及区别
  • K-meas 聚类、KNN算法、决策树、随机森林
  • Day 17: 3D点云深度学习专项 - 理论深度与面试精通之路
  • React中的合成事件
  • 不连续页分配器补充
  • Hadoop NameNode内存泄漏与GC停顿问题排查与解决方案
  • 防火墙配置
  • Hydra-SSH 破解安全防范
  • Hadoop(十)
  • C++三种对象实例化在栈或堆的区别
  • 碰一碰系统源码于小程序打通技术开发整合方案,驱动AI技术开发源代码
  • 深入解析TCP核心机制:连接管理、流量与拥塞控制
  • 【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
  • 医疗问诊陪诊小程序:以细节创新重塑就医体验的温度与效率
  • [20250908]Android Talkback 自定义合并
  • 【智能融合:增材制造多物理场AI建模与工业应用实战】
  • stm32——独立看门狗,RTC
  • LeetCode 3634.使数组平衡的最少移除数目
  • 106. 从中序与后序遍历序列构造二叉树【中等】