Django中软删除的具体实现
目录
- 1. 在模型里增加is_delete字段
- 2. 自定义 Manager(默认过滤掉删除的记录)
- 3. 在模型里应用 Manager
- 4. 重写delete()方法(软删除)
- 5. 如果要做批量删除
软删除(Soft Delete)是一种数据删除策略,它并不真正从数据库中删除记录,而是通过标记(如 is_deleted 字段)来表示记录已被删除。
这样做的好处是可以保留数据历史,支持数据恢复和审计。
在 Django 里可以通过 自定义 Manager + 重写 delete 方法 来实现。
1. 在模型里增加is_delete字段
from django.db import models
python
class BaseModel(models.Model):
is_delete = models.Boowww.devze.comleanField(default=False, verbose_name="是否删除")
class Meta:
abstract = True # 抽象基类,不会建表
这样所有继承 BaseModel 的表都有 is_delete 字段。
2. 自定义 Manager(默认过滤掉删php除的记录)
class ActiveManager(models.Manager):
def get_queryset(self):
android # 默认只返回 is_delete=False 的数据
return super().get_queryset().filter(is_delete=False)
3. 在模型里应用 Manager
class User(BaseModel):
name = models.CharField(max_length=100)
# managers
objects = 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 = True
self.save(update_fields=['is_delete']) # 只更新 is_delete 字段
这样:
u = User.objects.get(id=1) u.delete() # 不会真正删除,只会把 is_delete 置为 True
5. 如果要做批量删除
Django 的 QuerySet.delete() 默认会直接删掉数据,所以我们也可以自定义一个 QuerySet 来支持批量软删除:
cla编程客栈ss 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() # 也会变成软删除
✅ 总结:
is_delete字段标记是否删除。- 自定义 Manager 过滤掉已删除的数据。
- 重写
delete()实现软删除逻辑。 - 如有需要,配合自定义
QuerySet处理批量软删除。
到此这篇关于Django中软删除的具体实现的文章就介绍到这了,更多相关Django 软删除内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论