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简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
python 实时遍历日志文件
Apr 12 Python
教你使用python画一朵花送女朋友
Mar 29 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
Python IDE环境之 新版Pycharm安装详细教程
Mar 05 Python
Django之全局使用request.user.username的实例详解
May 14 Python
Django REST Swagger实现指定api参数
Jul 07 Python
Python绘制地图神器folium的新人入门指南
May 23 Python
python 字典和列表嵌套用法详解
Jun 29 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 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 db类库进行数据库操作
2009/03/19 PHP
PHP 写文本日志实现代码
2010/05/18 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
使用php的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
Python读取word文本操作详解
2018/01/22 Python
在Python中定义一个常量的方法
2018/11/10 Python
详解python-图像处理(映射变换)
2019/03/22 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
python:动态路由的Flask程序代码
2019/11/22 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
跟单文员岗位职责
2014/01/03 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
大学生党员自我批评
2014/02/14 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
2015年财政所工作总结
2015/04/25 职场文书
送达通知书
2015/04/25 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL