数据库
ORM框架
O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思。在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
使用django进行数据库开发的步骤如下:
配置数据库连接信息
在models.py中定义模型类
迁移
通过类和对象完成数据增删改查操作
配置
在settings.py中保存了数据库的连接配置信息,Django默认初始配置使用sqlite数据库。
使用MySQL数据库首先需要安装驱动程序
在Django的工程同名子目录的init.py文件中添加如下语句
作用是让Django的ORM能以mysqldb的方式来调用PyMySQL。
修改DATABASES配置信息
在MySQL中创建数据库
定义模型类
1 定义
1) 数据库表名
模型类如果未指明表名,Django默认以小写app应用名_小写模型类名为数据库表名。
可通过db_table指明数据库表名。
2) 关于主键
django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。
默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。
3) 属性命名限制
不能是python的保留关键字。
不允许使用连续的下划线,这是由django的查询方式决定的。
定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
4)字段类型
5) 选项
null是数据库范畴的概念,blank是表单验证范畴的
6) 外键
CASCADE级联,删除主表数据时连通一起删除外键表中数据
PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
SET()设置为特定值或者调用特定方法,如
DO_NOTHING不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常
2 迁移
将模型类同步到数据库中。
1)生成迁移文件
2)同步到数据库中
演示工具
shell工具
Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句。
通过如下命令进入shell
查看MySQL数据库日志
查看mysql数据库日志可以查看对数据库的操作记录。 mysql日志文件默认没有产生,需要做如下配置:
把68,69行前面的#去除,然后保存并使用如下命令重启mysql服务。
使用如下命令打开mysql日志文件。
数据库操作——增、删、改、查
增加
save
先创建模型类对象,执行对象的 save() 方法保存到数据库中
create
通过 模型类.objects.create() 保存,创建完直接保存
查询基本查询
get 查询单一结果,如果不存在会抛出 模型类.DoesNotExist 异常
all 查询多个结果
coutn 查询结果数量
过滤查询
实现 SQL 中的 where 功能
filter 过滤出多个结果
exclude 排除掉符合条件剩下的结果
get 过滤单一结果
对于过滤条件的使用,上述三个方法相同,仅以 filter 进行讲解
过滤条件的表达语法如下:
属性名称__比较运算符=值# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
相等
exact: 表示判等
模糊查询
contains:是否包含 如果要包含 % 无序转义,直接写即可
startswith、endswith:以指定值开头或结尾
以上运行符都区分大小写,在这些运算符前加上 i 表示不区分大小写
空查询
isnull:是否为 null
范围查询
in:是否包含在范围内
比较查询
gt:大于
gte:大于等于
lt:小于
lte:小于等于
不等于的运算符,使用 exclude() 过滤器
日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
F 对象
之前的查询都是对象的属性和常量值比较,使用 F对象可以实现两个属性直接进行比较
语法:
可以在 F 对象上使用算数运算
Q 对象
聚合函数
aggregaye 的返回值是一个字典类型
使用 count 时一般不使用 aggergate() 过滤器
排序
使用 order_by 对结果进行排序
关联查询
从一到多的访问语法
一对应的模型类对象.多对应的模型类名小写_set
从多到一的访问语法
多对应的模型类对象.多对应的模型类中关系类属性名
访问一对应的模型类关联对象的 id 语法
多对应的模型类对象.关联类属性_id
关联过滤查询
由多模型类条件查询一模型类数据:
语法如下:
注意:如果没有”__运算符”部分,表示等于。
例:
查询图书,要求图书英雄为”孙悟空”
查询图书,要求图书中英雄的描述包含”八”
由一模型类条件查询多模型类数据:
语法如下:
一模型类关联属性名__一模型类属性名__条件运算符=值
注意:如果没有”__运算符”部分,表示等于。
修改
save
修改模型类对象的属性,然后执行 save() 方法
update
使用模型类.objects.filter().update() ,会返回受影响的行数
删除
模型类对象 delete
模型类.objects.filter().delete()
查询集 QuerySet
概念
Django的ORM中存在查询集的概念。
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
all():返回所有数据。
filter():返回满足条件的数据。
exclude():返回满足条件之外的数据。
order_by():对结果进行排序。
对查询集可以再次调用过滤器进行过滤,如
也就意味着查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果。
从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句。
判断某一个查询集中是否有数据:
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
两大特性惰性执行
创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用
例如,当执行如下语句时,并未进行数据库查询,只是创建了一个查询集qs
继续执行遍历迭代操作后,才真正的进行了数据库的查询
缓存
使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。
限制查询集
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。
注意:不支持负数索引。
对查询集进行切片后返回一个新的查询集,不会立即执行查询。
如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()如果没有数据引发DoesNotExist异常。
示例:获取第1、2项,运行查看。
管理器 Manager
管理器是 Django 的模型进行数据库操作的接口,Django 应用的每个模型类都拥有至少一个管理器。
我们在通过模型类的objects属性提供的方法操作数据库时,即是在使用一个管理器对象objects。当没有为模型类定义管理器时,Django会为每一个模型类生成一个名为objects的管理器,它是models.Manager类的对象。
自定义管理器
我们可以自定义管理器,并应用到我们的模型类上。
注意:一旦为模型类指明自定义的过滤器后,Django不再生成默认管理对象objects。
• end •
领取专属 10元无门槛券
私享最新 技术干货