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


Posted in Python onAugust 14, 2019

软删除

简单的说,就是当执行删除操作的时候,不正真执行删除操作,而是在逻辑上删除一条记录。这样做的好处是可以统计数据,可以进行恢复操作等等。

预备知识

Managers

Managers 是django models 提供的一个用于提供数据库查询操作的接口,对于Django应用程序中的每个model都会至少存在一个Manager

详细:https://docs.djangoproject.com/en/dev/topics/db/managers/

django实现软删除model

firstly,

from django.db import models
from django.db.models.query import QuerySet

# 自定义软删除查询基类
class SoftDeletableQuerySetMixin(object):
  """
  QuerySet for SoftDeletableModel. Instead of removing instance sets
  its ``is_deleted`` field to True.
  """

  def delete(self):
    """
    Soft delete objects from queryset (set their ``is_deleted``
    field to True)
    """
    self.update(is_deleted=True)


class SoftDeletableQuerySet(SoftDeletableQuerySetMixin, QuerySet):
  pass


class SoftDeletableManagerMixin(object):
  """
  Manager that limits the queryset by default to show only not deleted
  instances of model.
  """
  _queryset_class = SoftDeletableQuerySet

  def get_queryset(self):
    """
    Return queryset limited to not deleted entries.
    """
    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 SoftDeletableManager(SoftDeletableManagerMixin, models.Manager):
  pass

secondly,

# 自定义软删除抽象基类
class SoftDeletableModel(models.Model):
  """
  An abstract base class model with a ``is_deleted`` field that
  marks entries that are not going to be used anymore, but are
  kept in db for any reason.
  Default manager returns only not-deleted entries.
  """
  is_deleted = models.BooleanField(default=False)

  class Meta:
    abstract = True

  objects = SoftDeletableManager()

  def delete(self, using=None, soft=True, *args, **kwargs):
    """
    Soft delete object (set its ``is_deleted`` field to True).
    Actually delete object if setting ``soft`` to False.
    """
    if soft:
      self.is_deleted = True
      self.save(using=using)
    else:
      return super(SoftDeletableModel, self).delete(using=using, *args, **kwargs)

class CustomerInfo(SoftDeletableModel):
  nid = models.AutoField(primary_key=True)
  category = models.ForeignKey("CustomerCategory", to_field="nid", on_delete=models.CASCADE, verbose_name='客户分类',
                 db_constraint=False)
  company = models.CharField(max_length=64, verbose_name="公司名称")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python运行时间的几种方法
Jun 17 Python
python队列queue模块详解
Apr 27 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
django rest framework 自定义返回方式
Jul 12 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
Jul 30 Python
详解KMP算法以及python如何实现
Sep 18 Python
python 实现socket服务端并发的四种方式
Dec 14 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 Python
Python基本数据类型之字符串str
Jul 21 Python
python实现登录密码重置简易操作代码
Aug 14 #Python
python 定时器每天就执行一次的实现代码
Aug 14 #Python
Django 项目重命名的实现步骤解析
Aug 14 #Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 #Python
python 叠加等边三角形的绘制的实现
Aug 14 #Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 #Python
Python 利用高德地图api实现经纬度与地址的批量转换
Aug 14 #Python
You might like
PHP+DBM的同学录程序(2)
2006/10/09 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
php计算一个文件大小的方法
2015/03/30 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
JavaScript 的方法重载效果
2009/08/07 Javascript
比Jquery的document.ready更快的方法
2010/04/28 Javascript
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
25个非常棒的jQuery滑块插件和教程小结
2011/09/02 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
判断数组的最佳方法(推荐)
2016/10/11 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
JS实现页面打印(整体、局部)
2017/08/18 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
Vue 去除路径中的#号
2018/04/19 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
基于JavaScript实现十五拼图代码实例
2020/04/26 Javascript
从零学Python之入门(三)序列
2014/05/25 Python
Python循环语句中else的用法总结
2016/09/11 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
给我一面国旗 python帮你实现
2019/09/30 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
python3 使用traceback定位异常实例
2020/03/09 Python
css3 transform属性详解
2014/09/30 HTML / CSS
留学推荐信怎么写
2014/01/25 职场文书
汽车队司机先进事迹材料
2014/02/01 职场文书
护士岗位职责
2014/02/16 职场文书
付款委托书范本
2014/04/04 职场文书
村安全生产责任书
2014/08/25 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书