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+Django+apache的配置方法详解
Jun 01 Python
python 调用HBase的简单实例
Dec 18 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
Python实现上下班抢个顺风单脚本
Feb 07 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
python多进程下实现日志记录按时间分割
Jul 22 Python
python 发送json数据操作实例分析
Oct 15 Python
python3中sorted函数里cmp参数改变详解
Mar 12 Python
python math模块的基本使用教程
Jan 16 Python
python数据分析之用sklearn预测糖尿病
Apr 22 Python
Python爬虫中urllib3与urllib的区别是什么
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
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
Python的高级Git库 Gittle
2014/09/22 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
用python找出那些被“标记”的照片
2017/04/20 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python和mysql交互操作实例详解【基于pymysql库】
2019/06/04 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
Python几种常见算法汇总
2020/06/02 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
毕业生自我鉴定
2013/12/04 职场文书
《乞巧》教学反思
2014/02/27 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
离婚协议书格式
2014/11/21 职场文书
小学教师个人总结
2015/02/05 职场文书
tree shaking对打包体积优化及作用
2022/07/07 Java/Android