Django中软删除的具体实现

作者:

文章目录
  • from django.db import models class BaseModel(models.Model): is_delete = models.BooleanField(default=False, verbose_name=”是否删除”) class Meta: abstract = True # 抽象基类,不会建表 这样所有继承 BaseModel 的表都有 is_delete 字段。
  • class ActiveManager(models.Manager): def get_queryset(self): # 默认只返回 is_delete=False 的数据 return super().get_queryset().filter(is_delete=False)
  • 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() # 不加过滤,所有数据都能查
  • 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
  • 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() # 也会变成软删除 ✅ 总结: is_delete 字段标记是否删除。 自定义 Manager 过滤掉已删除的数据。 重写 delete() 实现软删除逻辑。 如有需要,配合自定义 QuerySet 处理批量软删除。 到此这篇关于Django中软删除的具体实现的文章就介绍到这了,更多相关Django 软删除内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: django之自定义软删除Model的方法
  • 目录
    • 1. 在模型里增加is_delete字段
    • 2. 自定义 Manager(默认过滤掉删除的记录)
    • 3. 在模型里应用 Manager
    • 4. 重写delete()方法(软删除)
    • 5. 如果要做批量删除

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

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

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

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

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

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

    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()    # 不加过滤,所有数据都能查
    

    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
    

    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 处理批量软删除。

    到此这篇关于Django中软删除的具体实现的文章就介绍到这了,更多相关Django 软删除内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • django之自定义软删除Model的方法

    站内搜索