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中导入模型类,进行查看类型

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的模型类管理器——数据库操作的封装详解

来源:https://www.cnblogs.com/Lin-Yi/p/7523228.html

标签:django,数据库,封装
0
投稿

猜你喜欢

  • python类别数据数字化LabelEncoder VS OneHotEncoder区别

    2023-10-12 07:46:46
  • 会员下线加积分,实现原理分享(有时间限制)

    2023-06-11 08:39:45
  • mysql部分替换sql语句分享

    2024-01-23 18:17:35
  • SpringBoot调用python接口的实现步骤

    2022-01-24 22:41:57
  • Python数据结构树与算法分析

    2023-10-10 19:30:18
  • sqlserver主键自增的实现示例

    2024-01-16 22:41:10
  • MySQL 5.7.18 免安装版配置教程

    2024-01-16 06:12:51
  • 浅谈Python的Django框架中的缓存控制

    2022-01-23 10:56:24
  • 浅析DW4中的站点管理

    2007-02-03 11:40:00
  • SQL Server 2008 安装和配置图解教程(附官方下载地址)

    2024-01-12 20:28:17
  • Python 中如何写注释

    2022-07-10 21:53:11
  • 人工智能Text Generation文本生成原理示例详解

    2022-01-16 22:45:28
  • python 编码中为什么要写类型注解?

    2022-09-25 22:48:34
  • Python基于execjs运行js过程解析

    2021-08-10 22:56:47
  • python3模拟实现xshell远程执行linux命令的方法

    2022-05-26 11:45:14
  • Python实现笑脸检测+人脸口罩检测功能

    2022-06-24 04:01:49
  • MySQL创建带特殊字符的数据库名称方法示例

    2024-01-26 15:31:30
  • 列举Python中吸引人的一些特性

    2023-12-17 03:25:57
  • 使用Python编写一个最基础的代码解释器的要点解析

    2023-07-16 11:47:22
  • 深入理解NumPy简明教程---数组3(组合)

    2023-07-15 06:22:39
  • asp之家 网络编程 m.aspxhome.com