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实现socket客户端和服务端简单示例
Feb 24 Python
在windows下快速搭建web.py开发框架方法
Apr 22 Python
详解python开发环境搭建
Dec 16 Python
获取python文件扩展名和文件名方法
Feb 02 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
python实现简易数码时钟
Feb 19 Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 Python
python设置随机种子实例讲解
Sep 12 Python
python多线程使用方法实例详解
Dec 30 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 Python
python安装读取grib库总结(推荐)
Jun 24 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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 array_walk() 数组函数
2011/07/12 PHP
使用php判断浏览器的类型和语言的函数代码
2013/02/28 PHP
深入PHP FTP类的详解
2013/06/13 PHP
php中spl_autoload详解
2014/10/17 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
webpack多页面开发实践
2017/12/18 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
JS中比较两个Object数组是否相等方法实例
2019/11/11 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
python 实现矩阵按对角线打印
2019/11/29 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
Python如何存储数据到json文件
2020/03/09 Python
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
辛德勒的名单观后感
2015/06/03 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书