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中lambda的用法及其与def的区别解析
Jul 28 Python
Python简单生成8位随机密码的方法
May 24 Python
Python比较2个时间大小的实现方法
Apr 10 Python
pycharm 配置远程解释器的方法
Oct 28 Python
python实现简单的文字识别
Nov 27 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
python web框架 django wsgi原理解析
Aug 20 Python
Django基于客户端下载文件实现方法
Apr 21 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
Jul 03 Python
Python项目打包成二进制的方法
Dec 30 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 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生成缩略图的函数代码(修改版)
2011/01/18 PHP
PHP常见数组函数用法小结
2016/03/21 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
Vue.use源码分析
2017/04/22 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
python求质数的3种方法
2018/09/28 Python
python爬取网易云音乐评论
2018/11/16 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
伦敦最著名的老字号百货公司:Selfridges(塞尔福里奇百货)
2016/07/25 全球购物
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
教你怎样写好自我评价
2013/10/05 职场文书
大学毕业生简单自荐信
2013/11/05 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
协议书格式
2014/04/23 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技