ORM
- ORM全拼 Object-Relation Mapping, 对象-关系映射,主要实现模型对象到关系数据库数据的映射()
ORM图解
# 调用模型类对象的Save()生成 insert、update语句
# 调用模型类对象的Delete()生成delete语句
# 调用模型类的all()、get()生成select语句
#优点
* 只需要面向对象编程,不需要面向数据库编写代码
- 对数据库的操作都转化成类属性和方法的操作
- 不用编写各种数据库的sql语句
* 实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异
- 不在关注用的是myspl、oracle...等
- 通过简单的配置就可以轻松更换数据库,而不需要修该代码
# 缺点
* 相比较直接使用SQL语句操作数据库,有性能损失
* 根据对象的操作转换成SQL语句,根据查询的结果转化成对象,在映射过程中有性能损失
* 都不写SQL语句了
mysql数据库配置
pip install pymysql
DATABASES={
'default':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'Bookdb',
'HOST': '192.168.80.132',
'PORT': '3306',
'USER': 'root',
'PASSWORD': 'mysql',
}
}
control+d
字段类型
- 总结语法:属性名 = modles.字段类型(选项)
- 定义属性时需要指定字段类型,通过字段类型的参数指定选项
- 不允许使用python的保留关键字
- 不允许使用mysql的保留关键字
- 不允许使用连续的下划线,因为Django的查询语法就是连续的下划线
- 当前选择的数据库支持字段的类型
- 渲染管理表单时使用的默认html控件
- 在管理站点最低限度的验证
- 使用时需要引入from django.db import models包
AutoField:自动增长的IntegerField,通常不用指定
BooleanField:布尔字段,值为True或False
NullBooleanField:支持Null、True、False三种值
CharField(max_length=字符长度): 字符串
TextFiled:大文本字段,一般超过4000个字符时使用
IntegeField: 整数
DecimalField(max_digits=None,decimal_places=None):可以指定精度的十进制浮点数
FloatField: 浮点数
DateField[auto_now=False,auto_now_add=False]:日期
TimeField:时间,参数同DateField
DateTimeField:日期时间,参数同DateField
FileField:上传文件字段
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片
null:如果为True,表示允许为空,默认值是False(针对数据库表里的字段的约束)
blank:如果为True,则该字段允许为空白,默认值是False(针对后台站点的表单的约束)
db_column:字段的名称,如果未指定,则使用属性的名称
db_index:若值为True, 则在表中会为此字段创建索引,默认值是False
default:默认值
primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique:如果为True, 这个字段在表中必须有唯一值,默认值是False
ForeignKey:一对多,将字段定义在多的一端中
ManyToManField:多对多,将字段定义在任意一端中
OneToOneField:一对一,将字段定义在任意一端中
维护递归的关联关系,使用self指定
- 作用:修改数据库表的默认的名称
- 修改、创建表就要迁移
class Meta:
db_table = 'bookinfo'
模型成员
# 模型实例方法
str:在将对象转换成字符串时会被调用
save:将模型对象保存到数据库表中
delete:将模型对象从数据库表中删除
# objects模型属性
- objects: 管理器对象
- 是Manager类型的对象
- 用于模型对象和数据库交互
- 默认自动生成的属性,但是可以自定义管理器对象
- 自定义管理器对象后,Django不再可以自定义管理器对象objects
# 管理器类Manager
- 定义在from django.db import models中
- 管理器是Django的模型进行数据库操作的接口,Django应用的每个模型都拥有至少一个管理器
- Django模型支持自定义管理器类,继承自models.Manager
## 自定义管理器主要2中情况
1.修改原始查询集,重写get_queryset()方法
- 查询时,如果需要默认过虑掉某些数据,需要修改原始查询集
2.新增管理器方法,如创建模型对象方法.
- 当模型属性很多,多数字段默认值,每次只需要给少数属性赋值时,可以新增模型初始化方法
* 注意:不能重写init方法做初始化操作;因为Model本身会在init方法中做默认的初始化操作,如果重写该方法会跟Model默认的冲突
查询操作
# 特点
1.惰性执行:创建查询集不会访问数据库,直到在模板中调用数据时,才会访问数据库
- 调用数据的情况包括迭代、序列化、与if合用
2.缓存:查询集的结果被存下来之后,再次查询相同数据时会使用之前缓存的数据
# 返回列表的过滤器
all():返回所有的数据
filter():返回满足条件的数据
exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字
order_by:返回排序后的数据
# 返回单个对象的过滤器
get():返回单个满足条件的对象
count():返回当前查询的总条数
aggregate():聚合
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False
- 限制查询集
- 查询集返回列表,可以使用下标的方式进行限制,等同于sql中的limit和offset子句
- 注意:不支持负数索引
- 使用下标后返回一个新的查询集,不会立即执行查询
基础条件查询
- 语法:filter(模型属性__条件运算符=值)
- 提示:exact(判断相等可以不写直接id=1,id等价于PK)、contains(表示包含,类似like)、starswith(以什么开头)、endswith(以什么结尾)、isnull(是否为空)、in(表示只能在指定的选项中,不表示区间)、gt:大于lt:小于gte:大于等于 lte:小于等于,运算符都区分大小写,在其前加i表示不区分大小写
F和Q对象
from django.db.models import F
F('属性名')
from django.db.models import Q
Q(模型属性1_条件运算符=值) | Q(模型属性2_条件运算符=值)
~Q(模型属性_条件运算符=值)
聚合函数
- 使用aggregate()过滤器调用聚合函数,返回单个对象
# 聚合函数包括:Avg, Max, Min, Sum, Count(使用Count一般直接调用)
关联查询
# 基础关联查询
- 一查多:会把多的那个模型类名全部转成小写,再拼接_set
# 内连接查询语法
filter(关联模型类名小写_属性名_运算符=值)
- 多查一,关联的模型类名小写需要使用外键
# 自关联查询
自关联的表结构:对于地区信息、分类信息等数据,表结构非常类似,每个表的数据量十分有限,为了充分利用数据表的大量数据存储功能,可以可以设计成一张表,内部的关系字段指向本表的主键
说明:关系属性使用self指向本类,要求null和blank允许为空,因为一级数据是没有父级的