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实现代理服务功能实例
Nov 15 Python
详解Python2.x中对Unicode编码的使用
Apr 03 Python
Python求算数平方根和约数的方法汇总
Mar 09 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
python实现大转盘抽奖效果
Jan 22 Python
基于Python中的yield表达式介绍
Nov 19 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
Python 解决相对路径问题:"No such file or directory"
Jun 05 Python
Python之Matplotlib文字与注释的使用方法
Jun 18 Python
python让函数不返回结果的方法
Jun 22 Python
Python基于traceback模块获取异常信息
Jul 23 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 传值赋值与引用赋值的区别
2010/12/29 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
php查询内存信息操作示例
2019/05/09 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
8个有意思的JavaScript面试题
2019/07/30 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
Python程序设计入门(2)变量类型简介
2014/06/16 Python
python操作字典类型的常用方法(推荐)
2016/05/16 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
Final类有什么特点
2012/04/25 面试题
秘书专业自荐信范文
2013/12/26 职场文书
杠杆的科学教学反思
2014/01/10 职场文书
单位人事专员介绍信
2014/01/11 职场文书
英文求职信范文
2014/05/23 职场文书
技术员岗位职责
2015/02/04 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
企业法人代表证明书
2015/06/18 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python