本文首发于微信公众号:Hunter后端

原文链接: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 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 = BlogManager Blog.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笔记十九之manager用法介绍的更多相关文章

  1. python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法

    python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...

  2. (C/C++学习笔记) 十九. 模板

    十九. 模板 ● 模板的基本概念 模板(template) 函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 语法: template <<模 ...

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

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

  4. Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新

    CrmFetchKit.js是一个跨浏览器的一个类库,允许通过JavaScript来执行fetch xml的查询,还可以实现批量更新,分页查询等.目前已支持Chrome 25, Firefox 19 ...

  5. Django(十九)Ajax全套

    参考博客:http://www.cnblogs.com/wupeiqi/articles/5703697.html 提交: - Form - Ajax 一.Ajax,偷偷向后台发请求 - XMLHtt ...

  6. geotrellis使用(十九)spray-json框架介绍

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 spray-json简介 spray-json使用 ...

  7. 《objective-c基础教程》学习笔记(九)—— Foundation框架介绍

    在之前的博文中,我们创建的项目文件的时候,默认都有引用#import <Foundation/foundation.h> 这个头文件.但是,之前我们对Foundation都没有展开介绍.这 ...

  8. swift 笔记 (十九) —— 协议

    协议(Protocols) 协议仅是用定义某些任务或者是功能必须的方法和属性. 类似于java里的interface的作用.但协议并不会实现详细的功能. 我猜这个名字源于OO中提到的"契约& ...

  9. Java基础学习笔记十九 IO

    File IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再 ...

  10. Java基础学习笔记十九 File

    IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据 ...

随机推荐

  1. ant design upload组件的beforeUpload阻止默认上传行为

    const onImportExcel = (file) => { return new Promise(async (resolve, reject) => { ... //要执行的语句 ...

  2. prometheus 配置数据保留7天时间storage.tsdb.retention.time

    1.修改配置如下: 默认24h添加配置:retention: 168h

  3. 一本通c++约瑟夫问题

    #include<bits/stdc++.h>using namespace std;long long m,nn;struct n{ long long da; n *next;};n ...

  4. JMeter参数化(一)--CSV参数化

    一.CSV Data Set Config 1.添加配置元件-CSV Data Set Config 其中,分隔符不能是参数化的值中的符号,否则会被截断. 2.调用 3.循环读取文件中数据 假设数据内 ...

  5. 4、jmeter的断言技术

    断言:从反馈的结果来个需求匹配,是不是想要的内容 注:断言必要的时候才用  用过了会影响速度 1.操作步骤: 去选择自己想要响应的文本或者代码或者信息等等..... 2.断言相应大小的字节 3.断言响 ...

  6. hhtp协议和html标签分类css

    HTTP协议四大特性: 1基于请求响应 2 基于tcp/ip协议之上的应用层协议 3 无状态 不能保存用户信息 4 无链接,短链接 二 get和post的区别? 1 get 不安全,get请求没有请求 ...

  7. LR12输出+日志

    LR12输出 输出函数:1.lr_log_message() // 输出信息,并记录到 output.txt 中:2.lr_output_message() // 输出信息,不记录到日志文件中:3.l ...

  8. finereport连接sql server

    1.添加jdbc 2.选择sql server 3.jdbc:sqlserver://localhost:1433(localhost=其他IP地址)

  9. [RoarCTF 2019]Easy Calc 1

    进入主页面是一个计算器,可以计算 右键源代码发现提示信息,javascript脚本,其中还有calc.php文件 注释说明了这里引入了waf 尝试访问calc.php 是一道命令执行,尝试输入phpi ...

  10. Qt开发技术:Q3D图表开发笔记(一):Q3DScatter三维散点图介绍、Demo以及代码详解

    前言   qt提供了q3d进行三维开发,虽然这个框架没有得到大量运用也不是那么成功,性能上也有很大的欠缺,但是普通的点到为止的应用展示还是可以的.  其中就包括华丽绚烂的三维图表,数据量不大的时候是可 ...