
在 django orm 中,模型的 delete() 方法默认执行的是硬删除(hard delete),即直接从数据库中移除数据。然而,在许多实际应用场景中,直接删除数据可能会带来一系列问题,例如:
为了解决这些问题,软删除(Soft Delete)应运而生。软删除通过在模型中添加一个标记字段(如 is_deleted 或 deleted_at),在执行删除操作时仅更新此字段的状态,而不是真正删除数据库记录。
在 Django 中实现软删除,主要有两种途径:使用第三方库或自定义模型管理器。
django-safedelete 是一个功能强大且易于集成的第三方库,它为 Django 模型提供了全面的软删除功能,包括多种删除策略和方便的查询接口。
1. 安装与配置
首先,通过 pip 安装 django-safedelete:
pip install django-safedelete
然后,将其添加到 Django 项目的 INSTALLED_APPS 中:
# settings.py
INSTALLED_APPS = [
# ...
'safedelete',
# ...
]2. 模型集成
要使模型支持软删除,只需让其继承 safedelete.models.SafeDeleteModel 而不是 django.db.models.Model,并定义 _safedelete_policy 属性来指定删除策略。
# myapp/models.py
from django.db import models
from safedelete.models import SafeDeleteModel, SOFT_DELETE_CASCADE
class EmpModel(SafeDeleteModel):
# 定义软删除策略
# SOFT_DELETE_CASCADE: 软删除时,级联软删除关联对象
# HARD_DELETE: 执行硬删除
# NO_DELETE: 禁止删除
# SOFT_DELETE: 仅软删除当前对象
_safedelete_policy = SOFT_DELETE_CASCADE
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
# ... 其他字段
def __str__(self):
return self.name
完成模型修改后,记得执行数据库迁移:
python manage.py makemigrations python manage.py migrate
3. 视图层操作
集成 django-safedelete 后,您现有的 delete() 方法调用将自动执行软删除。
# myapp/views.py
from django.shortcuts import render, redirect, get_object_or_404
from .models import EmpModel
def Delemp(request, id):
# 获取要删除的员工对象
delemployee = get_object_or_404(EmpModel, id=id)
# 调用 delete() 方法,现在它将执行软删除
delemployee.delete()
# 获取所有未被软删除的员工数据
showdata = EmpModel.objects.all()
return render(request, "Index.html", {"data": showdata})
def RestoreEmp(request, id):
# 获取被软删除的员工对象
# all_objects 管理器可以查询所有对象,包括已软删除的
employee_to_restore = get_object_or_404(EmpModel.all_objects, id=id)
# 恢复对象
employee_to_restore.undelete()
showdata = EmpModel.objects.all()
return render(request, "Index.html", {"data": showdata})
4. 查询软删除数据
django-safedelete 提供了额外的管理器来方便地查询不同状态的数据:
5. 执行硬删除
如果需要强制执行硬删除,即使模型配置了软删除策略,也可以使用 hard_delete() 方法:
delemployee.hard_delete() # 这将从数据库中永久删除记录
如果您不想引入第三方库,或者需要更细粒度的控制,可以手动实现软删除逻辑。
1. 修改模型
在模型中添加一个布尔字段 is_deleted(或 deleted_at datetime 字段),并重写 delete 方法。
# myapp/models.py
from django.db import models
class SoftDeleteManager(models.Manager):
def get_queryset(self):
# 默认只返回未被删除的对象
return super().get_queryset().filter(is_deleted=False)
def all_objects(self):
# 返回所有对象,包括已删除的
return super().get_queryset()
def deleted_objects(self):
# 返回所有已删除的对象
return super().get_queryset().filter(is_deleted=True)
class EmpModel(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
is_deleted = models.BooleanField(default=False) # 软删除标记
objects = SoftDeleteManager() # 使用自定义管理器
def delete(self, *args, **kwargs):
# 重写 delete 方法,执行软删除
self.is_deleted = True
self.save()
def undelete(self, *args, **kwargs):
# 恢复软删除对象
self.is_deleted = False
self.save()
def hard_delete(self, *args, **kwargs):
# 执行硬删除
super().delete(*args, **kwargs)
def __str__(self):
return self.name
同样,修改模型后需要进行数据库迁移。
2. 视图层操作
视图层的操作与 django-safedelete 类似,但需要手动调用 undelete() 和 hard_delete() 方法。
# myapp/views.py
from django.shortcuts import render, redirect, get_object_or_404
from .models import EmpModel
def Delemp(request, id):
delemployee = get_object_or_404(EmpModel, id=id)
delemployee.delete() # 调用重写的 delete 方法,执行软删除
showdata = EmpModel.objects.all()
return render(request, "Index.html", {"data": showdata})
def RestoreEmp(request, id):
# 使用 all_objects 管理器查询已删除的对象
employee_to_restore = get_object_or_404(EmpModel.all_objects, id=id)
employee_to_restore.undelete() # 恢复对象
showdata = EmpModel.objects.all()
return render(request, "Index.html", {"data": showdata})
def HardDeleteEmp(request, id):
# 如果需要彻底删除,调用 hard_delete
employee_to_hard_delete = get_object_or_404(EmpModel.all_objects, id=id)
employee_to_hard_delete.hard_delete()
showdata = EmpModel.objects.all()
return render(request, "Index.html", {"data": showdata})
在 Django 应用中实现软删除是维护数据完整性和提升业务灵活性的重要实践。无论是选择功能丰富、易于集成的 django-safedelete 库,还是通过自定义管理器实现更精细的控制,理解其核心原理和注意事项都至关重要。通过合理运用软删除机制,您可以有效地管理数据生命周期,为用户提供更安全、更可靠的应用体验。
以上就是Django 软删除实现指南:告别硬删除,拥抱数据安全的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号