乐趣区

关于python: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 笔记。

原文链接:Django 笔记十九之 manager 用法介绍

如果想获取更多相干文章,可扫码关注浏览:

退出移动版