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 相关文章推荐
python中的内置函数getattr()介绍及示例
Jul 20 Python
Python多线程编程(四):使用Lock互斥锁
Apr 05 Python
举例讲解Python编程中对线程锁的使用
Jul 12 Python
python将控制台输出保存至文件的方法
Jan 07 Python
Python实现插入排序和选择排序的方法
May 12 Python
python-tkinter之按钮的使用,开关方法
Jun 11 Python
python之mock模块基本使用方法详解
Jun 27 Python
pyinstaller参数介绍以及总结详解
Jul 12 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
Sep 05 Python
Matplotlib scatter绘制散点图的方法实现
Jan 02 Python
Python post请求实现代码实例
Feb 28 Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 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
使用PHP和HTML5 FormData实现无刷新文件上传教程
2014/09/06 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
Javascript中暂停功能的实现代码
2007/03/04 Javascript
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
围观tangram js库
2010/12/28 Javascript
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
微信小程序自定义底部弹出框
2020/11/16 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
Python中apply函数的用法实例教程
2014/07/31 Python
Django中使用group_by的方法
2015/05/26 Python
21行Python代码实现拼写检查器
2016/01/25 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
python下载微信公众号相关文章
2019/02/26 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
Django的CVB实例详解
2020/02/10 Python
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
导游个人求职信
2014/04/25 职场文书
经理任命书模板
2014/06/06 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
《窃读记》教学反思
2016/02/18 职场文书
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android