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")
    
  • 相关阅读:
    [JavaScript]继续学习DOM事件模型
    [面试]作答整理一些面试题
    [JavaScript]使用jQuery实现无缝轮播
    [JavaScript]使用CSS + jQuery 实现自动轮播图
    [JavaScript]从DOM到jQuery(2)
    [JavaScript]从DOM到jQuery(1)
    [JavaScript]JavaScript中的函数(2)
    [JavaScript]JavaScript中的函数(1)
    [JavaScript]JavaScript中的Array
    React练习 7 :点击div,显示innerHTML
  • 原文地址:https://www.cnblogs.com/se7enjean/p/13186903.html
Copyright © 2011-2022 走看看