django自定义管理类的save model和delete model记一次进一步了解
业务背景:
最近在写一个个人博客网站,文章分类是一个自关联的两层分类。希望在点开分类时,显示一级分类、一级分类下的所有二级分类以及每个二级分类有多少个文章。最简单办法就是关联查询,查询出所有二级分类,再根据二级分类去查询二级分类的文章的个数。但是一想点一下分类就进行N次的关联查询,即使采用缓存,频繁增加删除文章情况下,数据库和redis都别活了。。。。
于是用空间换时间的方法,在文章分类表里加个count字段保存该分类文章个数。对count的修改想到django中自定义管理器类的save model和delete model方法,在对模型类对象增删改时,会去调这两个方法。
难点:
虽然知道在文章管理器类中的两个方法,但是
save model中如何知道是增加还是修改呢?
如何知道要改的文章对应的文章分类是谁呢?
带着两个问题去看文档,无果。看源码,看不懂。
于是,从save model的参数入手
save model的参数有四个:request、obj、form、change
首先排除request,分别对obj、form和change打印,结果发现:
obj是修改或增加的文章对象,由此可以找到文章分类对象,差分辨增加还是修改了
change是布尔值,多次打印发现文章修改、增加以及不变时打印的都是True,感觉没用
form没有猜错,是一段富文本对象,分别在增加和修改的情况下打印form.__dict__发现,form有一个属性initial在增加的时候为空字典,在修改的时候为 修改前的文章对象的字段和值组成的字典。
实现原理基本理清,上代码:

模型类:

明天再来排版
django自定义管理类的save model和delete model记一次进一步了解的更多相关文章
- Django 自定义分页类
分页类代码: class Page(object): ''' 自定义分页类 可以实现Django ORM数据的的分页展示 输出HTML代码: 使用说明: from utils import mypag ...
- [py][mx]django自定义认证类-实现邮箱作为用户名登录
创建自定义验证用户名密码类CustomBackend users/views.py from django.contrib.auth import authenticate, login from d ...
- Django自定义管理表单
修改polls/admin.py: from django.contrib import admin from .models import Choice, Question class Choice ...
- django后台管理
后台管理 1) 本地化 语言和时区的本地化. 修改settings.py文件. # LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-hans' # TIME_ ...
- 一.8.django权限管理/drf权限管理
1.什么是权限管理: .权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源 .权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个系 ...
- django+x-admin管理后台模板开发管理后台案例(设计部分)
使用django+x-admin管理后台模板搭建管理后台 一.环境需求 1.django:3.1 2.python:3.7 3.x-admin:2.2 4.pycharm:2020.3.2 5.ubu ...
- Django(四) 后台管理:创建管理员、注册模型类、自定义管理页面显示内容
后台管理 第1步.本地化:设置语言.时区 修改project1/settings.py #LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-hans' #设置语言 ...
- Django 自定义模型管理器类2个应用场景
class BookManager(models.Manager): # 改变查询集的结果集 def all(self): books = super().all() # QuerySet books ...
- django的模型类管理器-----------数据库操作的封装
模型实例方法 str():在将对象转换成字符串时会被调用. save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句. delete():将模型对象从数据表中删除 ...
- Django 自定义模型管理器(Manager)及方法
转载自:https://www.cnblogs.com/sui776265233/p/11571418.html 1.自定义管理器(Manager) 在语句Book.objects.all()中,ob ...
随机推荐
- 再识redis-2
Redis初识 特点关键字: 高性能Key-Value服务器 ops能达到十万级别 每秒能执行约11万集合 每秒约81000-条记录 主要数据结构 列表 集合 有序集合 散列(别名哈希 Redis的哈 ...
- vue table表格form表单校验输入内容,elment ui table内容校验 form表单input验证
//html 部分<el-form :model="formObj" :rules="rules"> <el-table :data=&quo ...
- WebSocket 基本使用
1. 引入 WebSocket 包 2. 2.最后测试 WebSocket 谷歌浏览器 F12 ,在 Console 控制台 输入以下测试链接,然后回车测试. ws = new WebSocket() ...
- Python的入门学习之Day 9——from“夜曲编程”
Day 9 time: 2021.8.6. 昨天复习了第一章"数据与运算".第二章"条件判断"的相关重点,今天就感觉得心应手了.今天上新的内容是关于新一章节&q ...
- 复杂SQL语句及其优化
一,复杂SQL语句类型 1 ,笛卡尔连接 题目1:找出工资超过各自经理的员工姓名 表:employee(id , name , depid , salary, manager_id ) SELECT ...
- go开发框架推荐
根据自己了解的情况,从易用性和文档完善程度来说,推荐优先考虑使用如下框架: fiber revel echo iris gin beego 以revel作为入门教程,在go项目的根文件夹里执行下面2条 ...
- Android蓝牙固件升级 DFU-OTA 固件升级
1.添加 依赖包: implementation 'no.nordicsemi.android:dfu:1.11.0' 2.DfuService类继承 DfuBaseService package ...
- @Component类相互引用的加载顺序
发现bug:没有消息通知,看日志发现调用消息通知的url前缀为null,定位到此工具类 进入工具类 进入ComponentConstant类:它引用了两个配置类 问题:component标注的类相互引 ...
- Appkiz.Base、Appkiz.Base.Languages
环境: ILSpy version 4.0.0.4319-beta2 选择 C#6.0 Visual Studio 2015 直接保存代码,直接用Visual Studio 2015打开.csprj文 ...
- STP协议-基础
生成树协议 一 .技术背景一个缺乏冗余性设计的网络:任何一个网络节点出现故障,会造成单链路故障.单设备故障,使整个网络瘫痪. 引入冗余性的同时也引入了二层环路:网络的冗余性增强了,但是却出现了二层环路 ...