首先介绍一下 manager 的使用场景,比如我们有一些表级别的,需要重复使用的功能,都可以使用 manager 来实现。

比如我们在前面的笔记中介绍的 model 的 create()、update() 等方法,Blog.objects.create() 中前面的 objects 就是一种 manager,不过这是系统给我们定义的。

那么我们也可以自己通过 manager 的方式来定义一些通用的函数方便我们在系统中使用。

  1. 定义 manager
  2. 使用 manager
  3. 通过 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用法介绍相关推荐

  1. Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法

    Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...

  2. Django笔记七之ManyToMany和OneToOne介绍

    ManyToMany 是一种多对多的关系,在用途和使用方法上和外键 ForeignKey 类似. 以下是本篇笔记的目录: ManyToMany 的介绍 through 参数 through_field ...

  3. Django笔记十二之defer和only

    本篇笔记将介绍查询中的 defer 和 only 两个函数的用法,笔记目录如下: defer only 1.defer defer 的英语单词的意思是 延迟.推迟,我们可以通过将字段作为参数传入,可以 ...

  4. 主成分分析碎石图_ISLR读书笔记十九:主成分分析(PCA)

    本文使用 Zhihu On VSCode 创作并发布 前面写的一些统计学习方法都是属于监督学习(supervised learning),这篇主成分分析(principal components an ...

  5. Mr.J-- jQuery学习笔记(十九)--自定义动画实现图标特效

    之前有写过自定义动画Mr.J-- jQuery学习笔记(十八)--自定义动画 这次实现一个小demo 图标特效 页面渲染 <!DOCTYPE html> <html lang=&qu ...

  6. 数据科学和人工智能技术笔记 十九、数据整理(上)

    十九.数据整理(上) 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 在 Pandas 中通过分组应用函数 import pandas as pd# 创建示例数据帧 d ...

  7. python 学习笔记十九 django深入学习四 cookie,session

    缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...

  8. iOS开发笔记之七十九——读写线程锁介绍(一)

    一.读写锁 在多线程环境下,我们经常会遇到读写同步的问题.常见的做法就是将读写做成互斥操作,但是这样会降低读写性能.通常情况下我们希望读操作之间是不互斥的,这个时候就需要用到读写锁了.简单来说,读写锁 ...

  9. 【Visual C++】游戏开发笔记十九 DirectX与OpenGL的博弈

    From: http://blog.csdn.net/zhmxy555/article/details/7522960 本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://bl ...

最新文章

  1. 如何判断CPU、内存、磁盘的性能瓶颈?
  2. IoC容器和Dependency Injection模式
  3. java公寓管理系统设计与实现_学生公寓(宿舍)管理系统的设计与实现(论文范文, jspjava).docx_蚂蚁文库...
  4. 获香港证监会颁发牌照的弘量研究,正用智能投顾帮助金融机构降低成本,提升资产管理能力 By 藤子2017年10月09日 17:16 撰文 | 藤子 2015 年,雷春然和黄耀东都是在香港科技大学的
  5. pyqt 不规则形状窗口显示
  6. idea展示runDashboard的窗口
  7. Win10下VB6.0开发之串口通信基础(二)代码功能篇
  8. 解决adb devices无法连接夜神模拟器
  9. 公需科目2020快速学习_2021公需科目学习快捷方法
  10. 电脑打开计算机显示远程过程调用失败,win7系统电脑弹出提示“远程过程调用失败且未执行”的解决方法...
  11. PS 滤镜算法原理——碎片效果
  12. PDF旋转使用的转换器有哪些
  13. 小度智能音箱Pro全新登场,百度软硬件结合如何青出于蓝而胜于蓝?
  14. AD20的一些基本操作
  15. OSChina 周六乱弹 —— 感谢女装红薯开办了这个网站
  16. 平衡左右脑、加强记忆、提高情商……冥想的这些好处你知道吗?
  17. 打开任务管理器的方法
  18. 手把手搭建SSM框架
  19. 当沙拉与火锅狭路相逢,长沙人的“肥胖焦虑“有何新解法?
  20. 深入String类不可变特性

热门文章

  1. 死神版zeal pal的练法
  2. 推荐几款常用的Chrome插件
  3. springboot从基础到实战
  4. java poi 解析为图片
  5. Java集合包含面试题
  6. Acer笔记本安装双系统出现触摸板无法使用问题的解决方法
  7. 三种方式生成小程序二维码
  8. 游戏关卡,出入口技术2
  9. matplotlib显示中文字体的常用三种方法
  10. python 报错: IndentationError: unindent does not match any outer indentation level