Django中关于Manager的使用
首先介绍一下 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 BookManager(modls.Manager):
def test_func(self, *args, **kwargs):
# 执行一些操作
return class Book(models.Model): objects = BookManager()
2、使用 manager
假设我们想实现这样一个功能,通过输入一个 keyword,返回所有 name 字段包含 keyword 的数据的总数。
不使用 manager 的话,我们大概每次都会这样来操作:
keyword = "python"
count = Book.objects.filter(name__icontains=keyword)
如果是使用 manager 来实现,则可以先定义这个函数:
class BookManager(models.Manager):
def contain_keyword_count(self, keyword):
return self.filter(name__icontains=keyword).count() class Book(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField() objects = BookManager()
那么通过 Manager 来操作便是:
keyword = "python"
count = Book.objects.contain_keyword_count(keyword)
注意,这里指向 BookManager 的变量,我们与系统默认的 objects 保持了一致,我们可以定义为其他名称,不过调用的时候,需要改成其他的形式即可,比如:
class Book(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField() book_objects = BookManager Book.book_objects.contain_keyword_count(keyword)
3、通过 manager 更改原始的 QuerySet
有一些底层的 QuerySet 的函数我们也可以通过 manager 的形式来继承修改,比如 get_queryset(),其他的比如 filter()、exclude()、all() 在底层都会调用这个函数。
现在我们来通过 manager 改写这个函数:
class BookManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(name__icontains="python") class Book(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField() objects = models.Manager()
book_objects = BookManager()
然后当我们调用下面的:
Book.objects.all()
Book.book_objects.all()
则会是两个结果,第一个返回的是原始的 all() 的结果,第二条则是我们定义了经过筛选的结果。
注意:book_objects 和原来的 objects 一样,可以在原来的基础上进行其他的筛选操作,比如:
Book.book_objects.filter(tagline='xxx')
以上只是简单介绍了 manager 的使用方法,我们可以往 manager 的函数里添加更多复杂的功能函数,这个可以根据需要添加。
参考自:https://zhuanlan.zhihu.com/p/510888239
Django中关于Manager的使用的更多相关文章
- Django 模型中自定义Manager和模型方法
1.自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager. 每个Django模型至少有一个m ...
- Django中自定义模型管理器(Manager)及方法
1.自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager.每个Django模型至少有一个ma ...
- Django中的Model继承
Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由 ...
- Django中的ORM
Django中ORM的使用. 一.安装python连接mysql的模块:MySQL-python sudo pip install MySQL-python 安装完成后在python-shell中测试 ...
- Django 中的 model 继承
Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由 ...
- django中的转义
什么是html转义? 所谓html转义就是将 html关键字(包括标签,特殊字符等) 进行过滤替换.过滤替换格式如下: 接下来我们通过实例演示django中转义的细节以及如何关闭转义 一 dja ...
- Django中模型(四)
Django中模型(四) 五.创建对象 1.目的 向数据库中添加数据.当创建对象时,Django不会对数据库进行读写操作,当调用save()方法时,才与数据库交互,将对象保存到数据库中 2.注意 __ ...
- Django中模型(三)
Django中模型(三) 四.模型成员 1.类属性 objects:是Manager类的一个对象,作用是与数据库进行交互. 定义模型类时,没有定义管理器,则默认创建名为objects的管理器. 2.自 ...
- Django中的事务(Transaction)管理
Django默认的事务行为 默认情况下,在Django中事务是自动提交的.当我们运行Django内置的模板修改函数时,例如调用model.save()或model.delete()时,事务将被立即提交 ...
- Django中对单表的增删改查
之前的简单预习,重点在后面 方式一: # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象 book_obj=Book.objects.creat ...
随机推荐
- 前端回血day24 flex子项伤的CSS属性
取值 含义 order 可以通过设置order改变某一个flex子项的排序位置.所有flex子项的默认order属性值是0 flex-grow 属性中的grow是扩展的意思,扩展的就是flex子项所占 ...
- CSS:布局篇_用flex布局实现两边顶宽中间自适应(圣杯布局&双飞翼布局)
CSS:布局篇_用flex布局实现两边顶宽中间自适应(圣杯布局&双飞翼布局) <!DOCTYPE html> <html> <head> <title ...
- 回归分析-2.X 简单线性回归
2.1 简单线性回归模型 y与x之间的关系假设 \(y=\beta_0+\beta_1x+\varepsilon\) \(E(\varepsilon|x)=0\) \(Var(\varepsilon| ...
- C语言中的malloc、new、memset函数解析
1. malloc 在window下,malloc的函数原型: extern void *malloc(unsigned int num_bytes); 头文件: #include<malloc ...
- 让自己的笔记本变wifi,如何设置呢?
让自己的笔记本变wifi,如何设置呢? 笔记本变wifi,居然有这样的好事,没错,就是这样的,我也是才知道,哈哈.果然,世上无奇不有,只是你不知罢了. 以win10笔记本为例,亲试有效,附上链 ...
- [JavaScript]对象数组 - 不完全整理
对象数组中查询属性为某个值的对象,使用Array.find() const array1 = [5, 12, 8, 130, 44]; const found = array1.find(elemen ...
- css 网页置灰
body *{ -webkit-filter: grayscale(100%); /* webkit */ -moz-filter: grayscale(100%); /*firefox*/ -ms- ...
- div里元素横向排列 居中对齐
<div> <img src="//s.weituibao.com/1582958061265/mlogo.png" alt=&quo ...
- SqlServer基礎
REVERSE(欄位) 反轉 CHARINDEX(篩選字符,欄位,[start]) 例:CHARINDEX('/',ProImage,13) 從13位查詢/所在索引 SUBSTRING(欄位,star ...
- 如何将视频作为Windows桌面动态壁纸,两步就可以搞定!
Windows本身自带的设置是不支持直接将视频用作壁纸,所以要想实现这个功能需要第三方工具的帮助 一.软件简介 这是一款可以将视频文件作为动态壁纸展示在电脑桌面的软件,它体积小巧,占用资源也不多,相比 ...