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的Flask框架中@app.route的用法教程
Mar 31 Python
Python使用PyCrypto实现AES加密功能示例
May 22 Python
将pandas.dataframe的数据写入到文件中的方法
Dec 07 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 Python
python 搜索大文件的实例代码
Jul 08 Python
python 矢量数据转栅格数据代码实例
Sep 30 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
Python 实现敏感目录扫描的示例代码
May 21 Python
python函数map()和partial()的知识点总结
May 26 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 Python
python编程实现清理微信重复缓存文件
Nov 01 Python
Python 读取千万级数据自动写入 MySQL 数据库
Jun 28 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
如何开发一个虚拟域名系统
2006/10/09 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
php限制ip地址范围的方法
2015/03/31 PHP
php验证码生成代码
2015/11/11 PHP
总结的一些PHP开发中的tips(必看篇)
2017/03/24 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
VUE+node(express)实现前后端分离
2019/10/13 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
简化Python的Django框架代码的一些示例
2015/04/20 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
python设置环境变量的作用整理
2020/02/17 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
艺术应用与设计专业个人的自我评价
2013/11/19 职场文书
文字自荐书范文
2014/02/10 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
篮球赛口号
2014/06/18 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
2014年路政工作总结
2014/12/10 职场文书
语文教师个人工作总结
2015/02/06 职场文书
赡养老人协议书范本
2015/08/06 职场文书
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python