首页 > 其他分享 >Django中关于Manager的使用

Django中关于Manager的使用

时间:2023-01-01 10:56:06浏览次数:47  
标签:Book keyword models Manager Django manager objects 关于

首先介绍一下 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

 

 

 

 

标签:Book,keyword,models,Manager,Django,manager,objects,关于
From: https://www.cnblogs.com/shaoyishi/p/17017840.html

相关文章

  • 04.关于线程你必须知道的8个问题(下)
    今天我们来学习线程中最后4个问题:线程的同步与互斥线程的本质与调度死锁的产生与解决多线程的是与非通过本篇文章,你可以了解到计算机中经典的同步机制--管程,Java线......
  • Django rest framework
    环境:事先安装python、虚拟环境、django,项目的创建省略。国内清华大学镜像pipinstallpython==3.10.5-ihttps://pypi.tuna.tsinghua.edu.cn/simple/pipinst......
  • Trick 5: 关于 GCD 的一些处理方法和性质
    经典的mobius:\(\varepsilon(x)=\sum\limits_{d|x}\mu(d)\)经典的euler:\(x=\sum\limits_{d|x}\varphi(d)\)处理区间问题。如果考虑一段区间的\(\gcd\),那......
  • 关于python列表的insert和append方法的执行效率对比
    关于python中insert可以在指定的索引前插入元素,也即是插入的元素的索引即为指定的索引而append方法,是指的在列表的末尾处添加/追加一个元素 两种方法都是为列表新增加......
  • 关于常系数齐次线性递推数列能被表示成等比数列线性和的证明
    退役OIer来诈尸了,祝大家新年快乐。问题引入下面的所有数列默认下标从\(0\)开始。对于一个数列\(\{a_n\}\),如果其满足\(k\)阶常系数齐次线性递推关系:\[a_n=\sum_{......
  • 关于if语句的几点思考!!
    这是关于在数组中寻找某个数(answer)的下标的程序的两种写法,结果却截然不同,由此引发了对if语句的进一步思考。写法一:#include<stdio.h>intmain(){intarr[]={1,2,3,4,......
  • 关于博客内容的一点小事
    最近大家一直都在问博客密码的事,在这里统一说一下吧,所有关于题目的博客密码都是2509,大家想看的话,用这个打开就好了当初写博客没想到会有那么多朋友们看,现在想想,如果能帮到......
  • 关于mozi初始化中出现的问题
    在mozi的执行中,出现了一个问题:  经过检查,发现是因为重复初始化了:  经过注释掉红线行,发现顺利运行。......
  • 关于echarts使用的一些tips
    本文总结一下关于echarts使用的一些小技巧,助力显示样式更美观 1、饼图设置可滚动图例有时图表中的图例太多,一行放不下,此时可使用滚动图例,如下图例不可滚动图例可滚......
  • python 部署django项目到公网 无法连接
    https://blog.csdn.net/xiongzaiabc/article/details/108448390 服务器后台运行:https://www.jianshu.com/p/4041c4e6e1b0......