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 相关文章推荐
python3学习笔记之多进程分布式小例子
Feb 13 Python
Python装饰器原理与用法分析
Apr 30 Python
python实现QQ空间自动点赞功能
Apr 09 Python
python使用配置文件过程详解
Dec 28 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
使用python客户端访问impala的操作方式
Mar 28 Python
django创建超级用户时指定添加其它字段方式
May 14 Python
Python socket服务常用操作代码实例
Jun 22 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 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函数解决SQL injection
2006/10/09 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
jQuery的Ajax的自动完成功能控件简要说明
2013/02/22 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
JS实现的另类手风琴效果网页内容切换代码
2015/09/08 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
Python下载指定页面上图片的方法
2016/05/12 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
浅谈Selenium 控制浏览器的常用方法
2020/12/04 Python
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
Python是如何进行类型转换的
2013/06/09 面试题
文员岗位职责范本
2014/03/08 职场文书
安全承诺书格式
2014/05/21 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
Python中的 enumerate和zip详情
2022/05/30 Python