django的模型类管理器——数据库操作的封装详解
作者:稀里糊涂林老冷 发布时间:2024-01-12 19:12:53
模型实例方法
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中导入模型类,进行查看类型
自定义模型管理器类
自定义一个管理器类,这个类继承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(),使用这个时候必须带参数
数据库就已经有了
模型管理器类和模型类的关系
来源:https://www.cnblogs.com/Lin-Yi/p/7523228.html


猜你喜欢
- 效果图:代码如下:<!DOCTYPE html><html> <head> <meta chars
- 细节汇总函数的形参列表可以是多个,返回值列表也可以是多个形参列表和返回值列表的数据类型,可以是值类型、也可以是引用类型函数的命名遵循标识符命
- Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测
- 本文实例为大家分享了python实现库存商品管理系统的具体代码,供大家参考,具体内容如下题目要求:请设计一个商品管理系统,程序要求根据用户输
- 绘制八个子图import matplotlib.pyplot as pltfig = plt.figure()shape=['.
- expand表示是否把series类型转化为DataFrame类型下面代码中的n表示去掉下划线"_"的数量代码如下:im
- 在本文中,我想向您介绍如何在Django中使用聚合,聚合的含义是“内容相关项的集合,以便它们可以显示或链接到”。在Django中,我们使用的
- 1. 直方图概述(1)基本概念直方图就是对图像的另外一种解释,它描述了整幅图像的灰度分布。直方图的 x 轴代表灰度值(0~255),y 轴代
- 本文实例讲述了django框架创建应用操作。分享给大家供大家参考,具体如下:18.1.5 安装Django安装Djangonod
- 如果您刚刚开始接触网页设计,是不是经常发生这样的问题呢?做好的网页在自己机器上可以正常浏览,而把页面传到服务器上就总是出现看不到图片,css
- 本章我们来实现一下折线图,有了画柱状图的经验,我们可以快速的分析出柱状图和折线图的区别主要是x轴比例尺和绘制数据图形,其余的画布,坐标轴等,
- 写这个文章绝对是偶然的偶然的机会,前年等一回的 元旦节,和 老婆上街 溜达,猛然想起买上一张福利彩票,结果屁都没有中上,开春第一
- 之前用Vue+element写了一个后台管理系统,在登录时使用axios请求数据传参时无法正常的获取数据。之后也是一通百度,发现原因是传递参
- 获取百度的歌曲名,歌手和链接!! package webTools; import java.io.BufferedReader; impo
- 近年来流行 Ajax,而 Ajax 的本质就是 XMLHttpRequest,是客户端 XMLHttpRequest 对象的使用。相对于 A
- 一、pexpect模块介绍Pexpect使Python成为控制其他应用程序的更好工具。可以理解为Linux下的expect的Python封装
- 浅拷贝和深拷贝拷贝函数是专门为可变数据类型list、set、dict使用的一种函数。作用是,当一个值指向另一个值的时候,也不会影响指向的值,
- 请先看看以下演示中的图案文字。这可不是图片效果,而是用CSS滤镜中的Chroma() 语句做成的文本文
- 本文实例讲述了Python排序搜索基本算法之插入排序。分享给大家供大家参考,具体如下:插入排序生活中非常常见,打扑克的时候人的本能就在用插入
- 轮播图功能安装依赖模块图片处理模块pip install pillow上传文件相关配置由于我们需要在后台上传我们的轮播图图片,所以我们需要在