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 with用法实例
Apr 14 Python
简单介绍Python中利用生成器实现的并发编程
May 04 Python
Python易忽视知识点小结
May 25 Python
python检查URL是否正常访问的小技巧
Feb 25 Python
Python闭包的两个注意事项(推荐)
Mar 20 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
django模板结构优化的方法
Feb 28 Python
PyCharm中代码字体大小调整方法
Jul 29 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
Python如何测试stdout输出
Aug 10 Python
用python写PDF转换器的实现
Oct 29 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 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+mysql)
2007/11/23 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
Angular2 路由问题修复详解
2017/03/01 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
JS实现拼图游戏
2021/01/29 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
详解numpy的argmax的具体使用
2019/05/27 Python
使用Pyhton集合set()实现成果查漏的例子
2019/11/24 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
白酒市场营销方案
2014/02/25 职场文书
信息管理应届生求职信
2014/03/07 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
初一数学教学反思
2016/02/17 职场文书