Django模型管理器详解:自定义Manager与数据库操作封装

洛溪
洛溪
发布时间:2026-10-13| 4人浏览过
原创

本文深入解析Django模型类管理器(Manager)的机制,包括默认的objects属性及自定义管理器的创建方法。详细讲解如何通过继承models.Manager重写all()方法以过滤查询结果,以及如何添加额外方法实现数据的高效插入。通过具体代码示例,展示如何封装数据库操作,提升Django应用的数据交互效率与代码规范性。

Django模型实例方法概述

模型实例方法

当对象被转换为字符串时,系统会自动调用str()方法。

save()方法用于将模型对象持久化到数据表中,ORM框架会自动将其转换为相应的insert或update SQL语句执行。

delete()方法用于从数据表中移除模型对象,ORM框架会将其转换为对应的delete语句执行。

模型类属性与默认管理器

模型类的属性

属性objects是一个管理器实例,类型为Manager,负责模型与数据库之间的交互操作。

若未在模型类中显式定义管理器,Django会自动生成一个名为objects的默认管理器;一旦定义了自定义管理器,系统将不再创建默认的objects。

管理器是Django模型进行数据库交互的接口,每个Django应用中的模型类至少包含一个管理器。Django允许用户自定义管理器类,该类需继承自models.Manager。

自定义管理器的应用场景

自定义管理器类主要适用于以下两种场景:

1. 修改原始查询集,例如重写all()方法。

2. 向管理器类中扩展额外方法,如封装数据插入逻辑。

1. 修改原始查询集,重写all()方法。

重写all()方法过滤查询结果


#图书管理器
class BookInfoManager(models.Manager):
 def all(self):
  #默认查询未删除的图书信息
  #调用父类的成员语法为:super().方法名
  return super().all().filter(isDelete=False)

b)在模型类BookInfo中定义管理器


class BookInfo(models.Model):
 ...
 books = BookInfoManager()

2. 在管理器类中定义创建对象的方法

创建模型类对象时,Django不会立即对数据库进行读写;只有调用save()方法时,才会与数据库交互,执行insert或update操作以保存数据。若模型类属性较多,逐个赋值较为繁琐,推荐使用管理器来简化操作。

添加额外方法封装数据插入


class BookInfoManager(models.Manager):
 ...
 #创建模型类,接收参数为属性赋值
 def create_book(self, title, pub_date):
  #创建模型类对象self.model可以获得模型类
  book = self.model()
  book.btitle = title
  book.bpub_date = pub_date
  book.bread=0
  book.bcommet=0
  book.isDelete = False
  # 将数据插入进数据表
  book.save()
  return book

b)为模型类BookInfo定义管理器books,语法如下


class BookInfo(models.Model):
 ...
 books = BookInfoManager()

c)调用语法如下:

调用示例:

book=BookInfo.books.create_book("abc",date(1980,1,1))

模型管理器机制深入解析

补充知识:Django中的模型类管理器以及自定义管理器

模型类.objects.all()中的objects究竟是什么?

回答:objects是Django自动生成的管理器对象,通过该对象可实现对数据的查询操作。

objects是models.Manger类的一个实例对象。

一旦自定义了管理器,Django将不再自动生成默认的objects管理器。

使用博客之前使用过的模型类,然后在项目的shell中导入模型类,进行查看类型

自定义模型管理器类

自定义一个管理器类,这个类继承models.Manger类。

再在具体的模型类里定义一个自定义管理器类的对象。

定义一个模型管理器类,然后在模型类中使用

自定义管理器类的实现步骤


class BookInfoManager(models.Manager):
 """图书模型管理器类"""
 pass
 
class BookInfo(models.Model):
 """图书模型类"""
 # 图书名称
 btitle = models.CharField(max_length=20)
 # 出版日期
 bpub_date = models.DateField()
 # 阅读量
 bread = models.IntegerField(default=0)
 # 评论量
 bcomment = models.IntegerField(default=0)
 # 删除标记
 isDelete = models.BooleanField(default=False)
 
 '''自定义管理器'''
 book = BookInfoManager()

然后在项目的shell中,

我们一旦自定义了管理器,就要使用定义的管理器查询,可以看到我们自定义的Manager

自定义管理器类的应用场景

1.改变查询的结果集。

比如调用BookInfo.books.all()返回的是没有删除的图书的数据。

2.添加额外的方法。

管理器类中定义一个方法帮我们操作模型类对应的数据表。

使用self.model()就可以创建一个跟自定义管理器对应的模型类对象。

1.举例,模型类对应的表中有这个表

现在通过BookInfo.book.all()自定义管理器只取到isDelete为0的数据

重写all()方法,如果有其他的需求的时候可以重新其他对应的方法

验证查询结果与数据插入


class BookInfoManager(models.Manager):
 """图书模型管理器类"""
 # 改变查询的结果集
 def all(self):
  # 1.调用父类的all,获取所有数据
  books = super().all() # QuerySet
  # 2.对数据进行过滤
  books = books.filter(isDelete=False)
  # 3.返回books
  return books

然后进行验证,重新打开项目的shell,进行查询之后就获取到了4条数据(过滤掉了一条)

2.为模型类添加额外的方法,使其通过模型类.方法名就可以插入保存数据

管理器与模型类的关系总结


class BookInfoManager(models.Manager):
 """图书模型管理器类"""
 
 # 改变查询的结果集
 def all(self):
  # 1.调用父类的all,获取所有数据
  books = super().all() # QuerySet
  # 2.对数据进行过滤
  books = books.filter(isDelete=False)
  # 3.返回books
  return books
 
 # 封装函数:操作模型类对应的数据表
 '''添加额外的方法'''
 def create_book(self, btitle, bpub_date):
  # 1.创建一个图书对象
  model_class = self.model
  book = model_class()
  book.btitle = btitle
  book.bpub_date = bpub_date
  # 2. 保存进数据库
  book.save()
  # 3. 返回obj
  return book

然后重新进入到项目的shell中进行插入,注意:日期要符合日期字符串的格式,或者使用date()函数

数据中也相应的有了该条数据,因为我们在额外的方法中使用了save()函数保存到数据库

这个额外的方法通常写在管理器中,当然也可以写在模型类中,当写在模型类中,使用的时候则直接模型类调用该方法就行了,并且定义成模型类的类方法。注意区别

把方法定义在管理器的时候,管理器中有个自带的方法create(),使用这个时候必须带参数

数据库就已经有了

模型管理器类和模型类的关系

以上这篇django的模型类管理器——数据库操作的封装详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。