django的模型类管理器——数据库操作的封装详解


Posted in Python onApril 01, 2020

模型实例方法

str():在将对象转换成字符串时会被调用。

save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句。

delete():将模型对象从数据表中删除,ORM框架会转换成对应的delete语句。

模型类的属性

属性objects:管理器,是Manager类型的对象,用于与数据库进行交互。

当没有为模型类定义管理器时,Django会为模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects。

管理器是Django的模型进行数据库操作的接口,Django应用的每个模型都拥有至少一个管理器。Django支持自定义管理器类,继承自models.Manager。

自定义管理器类主要用于两种情况:

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

2.向管理器类中添加额外的方法,如向数据库中插入数据。

1.修改原始查询集,重写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中导入模型类,进行查看类型

django的模型类管理器——数据库操作的封装详解

自定义模型管理器类

自定义一个管理器类,这个类继承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

django的模型类管理器——数据库操作的封装详解

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

1.改变查询的结果集。

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

2.添加额外的方法。

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

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

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

django的模型类管理器——数据库操作的封装详解

现在通过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条数据(过滤掉了一条)

django的模型类管理器——数据库操作的封装详解

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()函数

django的模型类管理器——数据库操作的封装详解

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

django的模型类管理器——数据库操作的封装详解

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

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

django的模型类管理器——数据库操作的封装详解

数据库就已经有了

django的模型类管理器——数据库操作的封装详解

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

django的模型类管理器——数据库操作的封装详解

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

Python 相关文章推荐
Django与遗留的数据库整合的方法指南
Jul 24 Python
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
Jul 02 Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 Python
Django开发中复选框用法示例
Mar 20 Python
详解python配置虚拟环境
Apr 08 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
pytorch 自定义参数不更新方式
Jan 06 Python
pycharm 更改创建文件默认路径的操作
Feb 15 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
什么是python的列表推导式
May 26 Python
Windows下pycharm安装第三方库失败(通用解决方案)
Sep 17 Python
opencv中图像叠加/图像融合/按位操作的实现
Apr 01 #Python
Django数据库操作之save与update的使用
Apr 01 #Python
django model通过字典更新数据实例
Apr 01 #Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 #Python
python 日志 logging模块详细解析
Mar 31 #Python
django迁移文件migrations的实现
Mar 31 #Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 #Python
You might like
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
PHP简单实现欧拉函数Euler功能示例
2017/11/06 PHP
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
13个PHP函数超实用
2015/10/21 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
Three.js学习之几何形状
2016/08/01 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
Vue常用的全选/反选的示例代码
2020/02/19 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
Python函数中不定长参数的写法
2019/02/13 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
Python如何根据时间序列数据作图
2020/05/12 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
地理科学专业毕业生求职信
2013/10/15 职场文书
品质主管岗位职责
2014/03/16 职场文书
规范化管理年活动总结
2014/08/29 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
使用springMVC所需要的pom配置
2021/09/15 Java/Android
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技
Go语言编译原理之源码调试
2022/08/05 Golang
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技