首页 > 其他分享 >Django笔记十九之manager用法介绍

Django笔记十九之manager用法介绍

时间:2023-04-08 23:01:09浏览次数:41  
标签:keyword models BlogManager Django Blog manager objects 十九

本文首发于微信公众号: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 文件。

如果想获取更多相关文章,可扫码关注阅读:
image

标签:keyword,models,BlogManager,Django,Blog,manager,objects,十九
From: https://www.cnblogs.com/hunterxiong/p/17299485.html

相关文章

  • 什么是 Google Tag Manager 的 Data Layer Object?
    在GoogleTagManager中,DataLayerObject是一个JavaScript对象,它可以用于在页面上收集和传递数据。DataLayerObject通常用于将有关用户和页面的信息收集和传递给GoogleAnalytics或其他第三方分析和营销工具。使用DataLayerObject,您可以在网站的任何地方设置变量并将......
  • Django基础 - 05Model模型之CRUD
     一、模型类的objects1.1objects字段默认情况下,由创建模型类的元类在模型类中创建一个 django.db.models.Manager类的对象,赋给objects。 Manager类实际是QuerySet类的子类。classCategoryEntity(models.Model):objects=models.Manager()#objects必须为......
  • JDBC-API详解--DriverManager
    DriverManager(驱动管理类)作用:1.注册驱动2.获取数据库连接参数:1.url:连接路径 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1......示例:jdbc:mysql://127.0.0.1:3306/db1;注:如果连接本机mysql服务器,且mysql服务器默认端口是3306,则url可以简......
  • django model ForeignKey ,解决外键字段增加_id 的问题
    例如:主表-模型: Author:id,name副表-模型:Book:id,author(ForeignKey:Author),name 1.数据库字段增加_id的问题,网上有很多教程,可以使用 db_column='yourname'2.当Book查询中,使用filter,all等查询,都会得到字段author_id,而不是author,可以使用values(),方法指定字段名称,例......
  • Vue进阶(四十九):在Webapp上使用input:file, 指定capture属性调用默认相机,摄像,录音功能
    在webapp上使用input:file,指定capture属性调用默许相机,摄像,录音功能。在webapp上使用input:file,指定capture属性调用默认相机,摄像,录音功能在iOS6下开发webapp,使用input之file,很有用<inputtype="file"accept="image/*"capture="camera"><inputtype="file"acce......
  • flask_day05:信号 Django信号 flask-script sqlalchemy 创建操作数据表
    目录回顾信号比如:用户表新增一条记录时,就记录一下日志内置信号:flask少一些,Django多一些使用内置信号量的步骤自定义信号Django信号django中使用内置信号flask-script自定制命令sqlalchemy快速使用原生操作的快速使用创建操作数据表鲁棒性链路,链路追踪,上下游,大的单体应用,上游还......
  • django中使用orm连接mysql,setting.py的设置
    默认使用的时sqllite数据库,我们需要改成mysql,只要需要填写相关信息即可。比如mysql的数据库名,用户名,密码,主机地址,端口等信息#Database#https://docs.djangoproject.com/en/4.1/ref/settings/#databases#DATABASES={#'default':{#'ENGINE':'django.db.b......
  • django/flask高并发部署
    django和flask是同步框架,部署的时候使用uwsgi部署,uwsgi是多进程多线程框架,并发量不高大概几十。我们可以通过uwsgi加gevent部署成异步程序,普通的部署方式uwsgi-x./luffyapi.xml这是使用genvent提高并发部署uwsgi--gevent50--gevent-monkey-patch./luffyapi.xml......
  • 手动配置resolv.conf 文件,不被NetworkManager修改
    /etc/resolv.conf默认情况下,RedHatEnterpriseLinux(RHEL)8上的NetworkManager使用来自活动NetworkManager连接配置文件的DNS设置 动态更新文件。但是,您可以禁用此行为并在/etc/resolv.conf.笔记或者,如果您需要DNS服务器的特定顺序/etc/resolv.conf,请参阅配置DNS服......
  • 学习使用VUE3+Django+GraphQL实现简单的Blog网站
    这周每天花点时间学习使用VUE3+Django+GraphQL的使用,按照RealPython的网站的教程走了一遍,踩了一遍坑.Realpython上的教程使用的是Vue2的Vue-CLI模块,Vue本身已经进化到VUE3,并且推荐使用Vite代替Vue-CLI.我按照教程上的步骤将代码转化为VUE3+Vite+CompositionAPI模式.在这里......