业务背景:

  最近在写一个个人博客网站,文章分类是一个自关联的两层分类。希望在点开分类时,显示一级分类、一级分类下的所有二级分类以及每个二级分类有多少个文章。最简单办法就是关联查询,查询出所有二级分类,再根据二级分类去查询二级分类的文章的个数。但是一想点一下分类就进行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记一次进一步了解的更多相关文章

  1. Django 自定义分页类

    分页类代码: class Page(object): ''' 自定义分页类 可以实现Django ORM数据的的分页展示 输出HTML代码: 使用说明: from utils import mypag ...

  2. [py][mx]django自定义认证类-实现邮箱作为用户名登录

    创建自定义验证用户名密码类CustomBackend users/views.py from django.contrib.auth import authenticate, login from d ...

  3. Django自定义管理表单

    修改polls/admin.py: from django.contrib import admin from .models import Choice, Question class Choice ...

  4. django后台管理

    后台管理 1)  本地化 语言和时区的本地化. 修改settings.py文件. # LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-hans' # TIME_ ...

  5. 一.8.django权限管理/drf权限管理

    1.什么是权限管理: .权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源 .权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个系 ...

  6. 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 ...

  7. Django(四) 后台管理:创建管理员、注册模型类、自定义管理页面显示内容

    后台管理 第1步.本地化:设置语言.时区 修改project1/settings.py #LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-hans' #设置语言 ...

  8. Django 自定义模型管理器类2个应用场景

    class BookManager(models.Manager): # 改变查询集的结果集 def all(self): books = super().all() # QuerySet books ...

  9. django的模型类管理器-----------数据库操作的封装

    模型实例方法 str():在将对象转换成字符串时会被调用. save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句. delete():将模型对象从数据表中删除 ...

  10. Django 自定义模型管理器(Manager)及方法

    转载自:https://www.cnblogs.com/sui776265233/p/11571418.html 1.自定义管理器(Manager) 在语句Book.objects.all()中,ob ...

随机推荐

  1. C#-out和ref 参数修饰符

    参数修饰符: 无参数修饰符:如果一个参数没有任何参数修饰符修饰,那么认为它是值传递,意味着方法内部收到的是实参数据的副本 out:输出参数由方法内部进行赋值,(引用传递),如果方法内部没有给被out修 ...

  2. win10上打包的qt程序放到win7上打不开的解决方法

    在win 10 上编写并打包发布了qt5.12.3 msvc2017 32bit的qt程序,在其他win10 电脑上都能正常运行,但是放到win7电脑上,运行exe时依次出现缺少"msvcp ...

  3. CCF 201912-2 回收站选址

    #include <iostream> #include <bits/stdc++.h> #include <string> using namespace std ...

  4. 解决elementplus carousel固定高度问题/ResizeObserverAPI介绍

    "element-plus": "^2.2.26", "@vueuse/components": "^9.7.0", 引 ...

  5. Maven中的元素Exclusions、modules、parent、properties以及import

    Dependencies:是可选依赖(Optional Dependencies) Exclusions:是依赖排除(Dependency Exclusions) 2.Dependencies (1) ...

  6. CentOS 7 安装步骤以及初始化

    2. 虚拟机分配的资源 因为用的软件不一样,这里设置方法无法截图,但大至如下: 2CPU/1G内存/200G硬盘 去掉打印机等没用的硬件(macOS要去掉打印机和摄像头) 光盘开始选择空白光盘,不要在 ...

  7. windows下MinGW64编译环境设置

    windows下MinGW64编译环境设置 1. MinGW 介绍 MinGW 的全称是:Minimalist GNU on Windows .是将经典的开源 C语言 编译器 GCC 移植到了 Win ...

  8. 路由器WDS(无线桥接,无线中继)

    路由器WDS(无线桥接,无线中继)设置,网上的坑货教程只教了一半,却不教另一半.这些教程一般会教你填写远程路由(被中继的路由器信息),顶多再教你把本地路由的网段,改得跟远程路由一样,或关掉本地路由的D ...

  9. 网线接口调试,Android ADB网络调试!

    ADB网络调试,网线接口调试    没有USB接口,照样可以调试,可通过网线接口调试步骤! 一.第一步连接WIFI  查看wifi 的IP  win+R 键 打开运行 ,输入cmd   二.输入ipc ...

  10. ipmitool使用报错Could not open device at /dev/ipmi0 or /dev/ipmi/0 or /dev/ipmidev/0: No such file or directory

    ipmitool使用报错处理 Could not open device at /dev/ipmi0 or /dev/ipmi/0 or /dev/ipmidev/0: No such file or ...