zoukankan      html  css  js  c++  java
  • restframework 定义基类模型实现逻辑删除

    前言

    • 很多时候对于保存在数据库中的数据,我们不会做真正的物理删除,通过软删除的方式将数据屏蔽不序列化出来。
    • 对于删除的字段,可以用is_delete=True表示删除。为了查询方便,我们需要重新定义models中的Manager
    • Django3.0官网:https://docs.djangoproject.com/zh-hans/3.0/topics/db/managers/

    代码实现

    from django.db import models
    from django.db.models.query import QuerySet
    
    
    class SoftDeletableQuerySet(QuerySet):
        def delete(self):
            self.update(is_deleted=True)
    
    
    class SoftDeletableManager(models.Manager):
        """
        仅返回未被删除的实例
        """
        _queryset_class = SoftDeletableQuerySet
    
        def get_queryset(self):
            """
            在这里处理一下QuerySet, 然后返回没被标记位is_deleted的QuerySet
            """
            kwargs = {'model': self.model, 'using': self._db}
            if hasattr(self, '_hints'):
                kwargs['hints'] = self._hints
    
            return self._queryset_class(**kwargs).filter(is_deleted=False)
    
    
    class SoftDeleteMode(models.Model):
        create_time = models.DateTimeField(verbose_name='添加时间', auto_now_add=True)
        update_time = models.DateTimeField(verbose_name='更新时间', auto_now=True)
    
        """
        抽象类,添加is_deleted 字段
        """
        is_deleted = models.BooleanField(default=False)
    
        class Meta:
            abstract = True
    
        # 重新定义objects为我们自己的管理器,查询和添加操作时会判断该数据是否被删除
        objects = SoftDeletableManager()
    
        def delete(self, using=None, soft=True, *args, **kwargs):
            """
            这里需要真删除的话soft=False即可
            """
            if soft:
                self.is_deleted = True
                self.save(using=using)
            else:
                return super(SoftDeleteMode, self).delete(using=using, *args, **kwargs)
    
        # 时间为微秒的转换
        @property
        def _create_time(self):
            return self.create_time.strftime("%Y-%m-%d %H:%M:%S")
    
        @property
        def _update_time(self):
            return self.update_time.strftime("%Y-%m-%d %H:%M:%S")
    
  • 相关阅读:
    CentOS7 FTP安装与配置
    linux CentOS 安装 nginx
    linux CentOS YUM 安装 nginx+tomcat+java+mysql运行环境
    Node.js 开发
    Nginx 负载均衡
    BtxCMS.Net 项目
    不得不看!史上最全的三十多张架构师图谱!
    高危群体:开发者的自白,躲坑,迷茫,和下一步
    p2p-如何拯救k8s镜像分发的阿喀琉斯之踵
    Tower与DevCloud对比分析报告
  • 原文地址:https://www.cnblogs.com/se7enjean/p/13186903.html
Copyright © 2011-2022 走看看