Django笔记十九之manager用法介绍
首先介绍一下 manager 的使用场景,比如我们有一些表级别的,需要重复使用的功能,都可以使用 manager 来实现。
比如我们在前面的笔记中介绍的 model 的 create()、update() 等方法,Blog.objects.create() 中前面的 objects 就是一种 manager,不过这是系统给我们定义的。
那么我们也可以自己通过 manager 的方式来定义一些通用的函数方便我们在系统中使用。
- 定义 manager
- 使用 manager
- 通过 manager 更改原始的 QuerySet
1、定义 manager
定义的方式为创建一个继承 models.Manager 的类,定义所需要的函数,然后在 model 里定义 objects 指向这个 Manager 即可:
class BlogManager(modls.Manager):def test_func(self, *args, **kwargs):# 执行一些操作return class Blog(models.Model):objects = BlogManager()
2、使用 manager
假设我们想实现这样一个功能,通过输入一个 keyword,返回所有 name 字段包含 keyword 的数据的总数。
不使用 manager 的话,我们大概每次都会这样来操作:
keyword = "python"
count = Blog.objects.filter(name__icontains=keyword)
如果是使用 manager 来实现,则可以先定义这个函数:
class BlogManager(models.Manager):def contain_keyword_count(self, keyword):return self.filter(name__icontains=keyword).count()class Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField()objects = BlogManager()
那么通过 Manager 来操作便是:
keyword = "python"
count = Blog.objects.contain_keyword_count(keyword)
注意,这里指向 BlogManager 的变量,我们与系统默认的 objects 保持了一致,我们可以定义为其他名称,不过调用的时候,需要改成其他的形式即可,比如:
class Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField()blog_objects = BlogManagerBlog.blog_objects.contain_keyword_count(keyword)
3、通过 manager 更改原始的 QuerySet
有一些底层的 QuerySet 的函数我们也可以通过 manager 的形式来继承修改,比如 get_queryset(),其他的比如 filter()、exclude()、all() 在底层都会调用这个函数。
现在我们来通过 manager 改写这个函数:
class BlogManager(models.Manager):def get_queryset(self):return super().get_queryset().filter(name__icontains="python")class Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField()objects = models.Manager()blog_objects = BlogManager()
然后当我们调用下面的:
Blog.objects.all()
Blog.blog_objects.all()
则会是两个结果,第一个返回的是原始的 all() 的结果,第二条则是我们定义了经过筛选的结果。
注意:blog_objects 和原来的 objects 一样,可以在原来的基础上进行其他的筛选操作,比如:
Blog.blog_objects.filter(tagline='xxx')
以上只是简单介绍了 manager 的使用方法,我们可以往 manager 的函数里添加更多复杂的功能函数,这个可以根据需要添加。
以上就是本篇笔记的全部内容,下一篇笔记我们将介绍 migration 的命令和手动增加 migration 文件。
本文首发于本人微信公众号,可搜索关注:Django笔记。
如果想获取更多相关文章,可扫码关注阅读:
Django笔记十九之manager用法介绍相关推荐
- Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法
Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...
- Django笔记七之ManyToMany和OneToOne介绍
ManyToMany 是一种多对多的关系,在用途和使用方法上和外键 ForeignKey 类似. 以下是本篇笔记的目录: ManyToMany 的介绍 through 参数 through_field ...
- Django笔记十二之defer和only
本篇笔记将介绍查询中的 defer 和 only 两个函数的用法,笔记目录如下: defer only 1.defer defer 的英语单词的意思是 延迟.推迟,我们可以通过将字段作为参数传入,可以 ...
- 主成分分析碎石图_ISLR读书笔记十九:主成分分析(PCA)
本文使用 Zhihu On VSCode 创作并发布 前面写的一些统计学习方法都是属于监督学习(supervised learning),这篇主成分分析(principal components an ...
- Mr.J-- jQuery学习笔记(十九)--自定义动画实现图标特效
之前有写过自定义动画Mr.J-- jQuery学习笔记(十八)--自定义动画 这次实现一个小demo 图标特效 页面渲染 <!DOCTYPE html> <html lang=&qu ...
- 数据科学和人工智能技术笔记 十九、数据整理(上)
十九.数据整理(上) 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 在 Pandas 中通过分组应用函数 import pandas as pd# 创建示例数据帧 d ...
- python 学习笔记十九 django深入学习四 cookie,session
缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...
- iOS开发笔记之七十九——读写线程锁介绍(一)
一.读写锁 在多线程环境下,我们经常会遇到读写同步的问题.常见的做法就是将读写做成互斥操作,但是这样会降低读写性能.通常情况下我们希望读操作之间是不互斥的,这个时候就需要用到读写锁了.简单来说,读写锁 ...
- 【Visual C++】游戏开发笔记十九 DirectX与OpenGL的博弈
From: http://blog.csdn.net/zhmxy555/article/details/7522960 本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://bl ...
最新文章
- 如何判断CPU、内存、磁盘的性能瓶颈?
- IoC容器和Dependency Injection模式
- java公寓管理系统设计与实现_学生公寓(宿舍)管理系统的设计与实现(论文范文, jspjava).docx_蚂蚁文库...
- 获香港证监会颁发牌照的弘量研究,正用智能投顾帮助金融机构降低成本,提升资产管理能力 By 藤子2017年10月09日 17:16 撰文 | 藤子 2015 年,雷春然和黄耀东都是在香港科技大学的
- pyqt 不规则形状窗口显示
- idea展示runDashboard的窗口
- Win10下VB6.0开发之串口通信基础(二)代码功能篇
- 解决adb devices无法连接夜神模拟器
- 公需科目2020快速学习_2021公需科目学习快捷方法
- 电脑打开计算机显示远程过程调用失败,win7系统电脑弹出提示“远程过程调用失败且未执行”的解决方法...
- PS 滤镜算法原理——碎片效果
- PDF旋转使用的转换器有哪些
- 小度智能音箱Pro全新登场,百度软硬件结合如何青出于蓝而胜于蓝?
- AD20的一些基本操作
- OSChina 周六乱弹 —— 感谢女装红薯开办了这个网站
- 平衡左右脑、加强记忆、提高情商……冥想的这些好处你知道吗?
- 打开任务管理器的方法
- 手把手搭建SSM框架
- 当沙拉与火锅狭路相逢,长沙人的“肥胖焦虑“有何新解法?
- 深入String类不可变特性