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 相关文章推荐
9种python web 程序的部署方式小结
Jun 30 Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 Python
Python贪心算法实例小结
Apr 22 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
Pycharm 2020年最新激活码(亲测有效)
Sep 18 Python
Python @property原理解析和用法实例
Feb 11 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
浅析python标准库中的glob
Mar 13 Python
Python Selenium操作Cookie的实例方法
Feb 28 Python
教你如何用Python实现人脸识别(含源代码)
Jun 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中对xml读取的相关函数的介绍一
2008/06/05 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
php静态文件生成类实例分析
2015/01/03 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
php跨域调用json的例子
2013/11/13 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
python 接收处理外带的参数方法
2018/12/03 Python
Python自定义一个异常类的方法
2019/06/27 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
python 数据类型强制转换的总结
2021/01/25 Python
EJB3推出JPA的原因
2013/10/16 面试题
电气技术员岗位职责
2013/11/19 职场文书
公积金转移接收函
2014/01/11 职场文书
军神教学反思
2014/02/04 职场文书
音乐之声观后感
2015/06/04 职场文书
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
SQL注入详解及防范方法
2021/12/06 MySQL
HTML基本元素标签介绍
2022/02/28 HTML / CSS
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技
Golang ort 中的sortInts 方法
2022/04/24 Golang
Redis全局ID生成器的实现
2022/06/05 Redis