翼度科技»论坛 编程开发 python 查看内容

Django笔记十九之manager用法介绍

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
本文首发于微信公众号:Hunter后端
原文链接:Django笔记十九之manager用法介绍
首先介绍一下 manager 的使用场景,比如我们有一些表级别的,需要重复使用的功能,都可以使用 manager 来实现。
比如我们在前面的笔记中介绍的 model 的 create()、update() 等方法,Blog.objects.create() 中前面的 objects 就是一种 manager,不过这是系统给我们定义的。
那么我们也可以自己通过 manager 的方式来定义一些通用的函数方便我们在系统中使用。

  • 定义 manager
  • 使用 manager
  • 通过 manager 更改原始的 QuerySet
1、定义 manager

定义的方式为创建一个继承 models.Manager 的类,定义所需要的函数,然后在 model 里定义 objects 指向这个 Manager 即可:
  1. class BlogManager(modls.Manager):
  2.         def test_func(self, *args, **kwargs):
  3.                 # 执行一些操作
  4.                 return
  5. class Blog(models.Model):
  6.        
  7.         objects = BlogManager()
复制代码
2、使用 manager

假设我们想实现这样一个功能,通过输入一个 keyword,返回所有 name 字段包含 keyword 的数据的总数。
不使用 manager 的话,我们大概每次都会这样来操作:
  1. keyword = "python"
  2. count = Blog.objects.filter(name__icontains=keyword)
复制代码
如果是使用 manager 来实现,则可以先定义这个函数:
  1. class BlogManager(models.Manager):
  2.     def contain_keyword_count(self, keyword):
  3.         return self.filter(name__icontains=keyword).count()
  4. class Blog(models.Model):
  5.     name = models.CharField(max_length=100)
  6.     tagline = models.TextField()
  7.     objects = BlogManager()
复制代码
那么通过 Manager 来操作便是:
  1. keyword = "python"
  2. count = Blog.objects.contain_keyword_count(keyword)
复制代码
注意,这里指向 BlogManager 的变量,我们与系统默认的 objects 保持了一致,我们可以定义为其他名称,不过调用的时候,需要改成其他的形式即可,比如:
  1. class Blog(models.Model):
  2.     name = models.CharField(max_length=100)
  3.     tagline = models.TextField()
  4.     blog_objects = BlogManager
  5. Blog.blog_objects.contain_keyword_count(keyword)
复制代码
3、通过 manager 更改原始的 QuerySet

有一些底层的 QuerySet 的函数我们也可以通过 manager 的形式来继承修改,比如 get_queryset(),其他的比如 filter()、exclude()、all() 在底层都会调用这个函数。
现在我们来通过 manager 改写这个函数:
  1. class BlogManager(models.Manager):
  2.         def get_queryset(self):
  3.                 return super().get_queryset().filter(name__icontains="python")
  4. class Blog(models.Model):
  5.     name = models.CharField(max_length=100)
  6.     tagline = models.TextField()
  7.     objects = models.Manager()
  8.     blog_objects = BlogManager()
复制代码
然后当我们调用下面的:
  1. Blog.objects.all()
  2. Blog.blog_objects.all()
复制代码
则会是两个结果,第一个返回的是原始的 all() 的结果,第二条则是我们定义了经过筛选的结果。
注意:blog_objects 和原来的 objects 一样,可以在原来的基础上进行其他的筛选操作,比如:
  1. Blog.blog_objects.filter(tagline='xxx')
复制代码
以上只是简单介绍了 manager 的使用方法,我们可以往 manager 的函数里添加更多复杂的功能函数,这个可以根据需要添加。
以上就是本篇笔记的全部内容,下一篇笔记我们将介绍 migration 的命令和手动增加 migration 文件。
如果想获取更多相关文章,可扫码关注阅读:


来源:https://www.cnblogs.com/hunterxiong/p/17299485.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具