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面向对象class类属性及子类用法分析
Feb 02 Python
Python面向对象类继承和组合实例分析
May 28 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
Python生成器generator用法示例
Aug 10 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
Python 经典算法100及解析(小结)
Sep 13 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
Python3 如何开启自带http服务
May 18 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
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
javascript读取xml
2006/11/04 Javascript
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
python中遍历文件的3个方法
2014/09/02 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
python批量爬取下载抖音视频
2019/06/17 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
Ratchet 模态框的实现
2020/08/19 HTML / CSS
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
工厂实习感言
2014/01/14 职场文书
实习生自我评价
2014/01/18 职场文书
毕业生自荐信格式
2014/03/07 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
安全生产管理责任书
2014/04/16 职场文书
大型营销活动计划书
2014/04/28 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书