ORM : 对象关系映射(Object Relation Mapping)
主要实现了模型对象到关系型数据库的映射
比如将数据库表的每一行都映射成一个对象
定义的模型类中,通过属性体现表和对象间的关系,这里的属性就是将来数据表的字段
get()返回一个对象
all(),filert()返回一个列表
优点:1.只需要面向对象编程,通过修改类属性和方法就能完成对数据库表的操作、
2.屏蔽了不同数据库间的差异,(mysql,和oracle的操作上有的地方不同,比如查询语句)
缺点:他在操作数据库的时候需要根据对象的操作将其转化成sql语句,或者在查询的时候需要将查询的结果转化成对象,在映射的过程中有性能损失(也就是有点耗时间)
配置数据库
pymysql包。用于跟mysql数据库交互
在项目管理目录下的__init__模块中配置mysql
import pymysql
mysql.install_as_MySQLdb()
模型类定义属性的语法:
定义模型类时需要导包:from django.db omport models
属性名 = models.字段类型(选项)
属性命名时不可以使用python,mysql的保留关键字也不可以使用连续的下划线(django的查询方法就是使用联系的下划线)
字段类型:
AutoField:自动增长
BooleanField:布尔字段,值为True、False
NullBoolleanField:支持Null,True,False 三种植
CharField(max_length=字符长度):字符串
TextField:大文本字段,超4000个使用
IntegerField:整数
DecimalField(max_digits=None,decimal_places=None):指定精度的十进制浮点数
参数max_digits: 表示总位数
参数decimal_places;小数位数
FloatField:浮点数
DateField[auto_now=False,auto_now_add=False]:日期
auto_now 用于最后一次修改的时间戳
auto_now_add 表示对象第一四被创建时 的事件
两个参数放在一块会相互排斥,组合将发生错误
TimeField:时间,参数同DateField
Date TimeField:日期时间,参数同DateField
FileField:上传文件字段
imageField:继承于FileField ,对上传的内容进行校验,确保图片有效
选项
•通过选项实现对字段的约束
• null:如果为True,表示允许为空,默认值是False
• blank:如果为True,则该字段允许为空白,默认值是False
•对比:null是数据库范畴的概念,blank是表单验证范畴的
• db_column:字段的名称,如果未指定,则使用属性的名称
• db_index:若值为True, 则在表中会为此字段创建索引,默认值是False
• default:默认值
• primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
• unique:如果为True, 这个字段在表中必须有唯一值,默认值是False
•注意:Django会自动为表创建主键字段
◦ 如果使用选项设置某属性为主键字段后,Django不会再创建自动增长的主键字段
◦ 默认创建的主键字段为id,可以使用pk代替,pk全拼为primary key
关系字段类型
•关系型数据库的关系包括三种类型:
◦ ForeignKey:一对多,将字段定义在多的一端中
◦ ManyToManyField:多对多,将字段定义在任意一端中
◦ OneToOneField:一对一,将字段定义在任意一端中
•可以维护递归的关联关系,使用self指定,详见“自关联”
元选项
作用:修改数据库的表名
在模型类中定义元类Meta,设置元信息
使用db_table 自定义表的名字
class Meta:
db_table = ‘自定义表的名字’
模型的实例方法:
str(再将对象转化成字符串时调用)
save():将模型对象保存到数据库的表
objects 管理器对象 (模型和数据库做查询的接口)
deleate :将模型对象从数据库的表中删除
objects:
管理器对象
是Manager类型的对象,定义在from django.db import models中。
作用是用于模型对象和数据库进行交互
默认自动生成的属性,可以自定义管理器对象 = models.Manager()
manager这个管理器类使用get_queryset()方法来获取结果集
自定义管理器类的两种场景:(在自定义管理器类的时候需要使用自定义的管理器类创建一个新的管理器对象)
第一种就是需要重写get_queryset()查询集,原因是要用某些条件进行过滤
第二种就是新增管理器初始化实例对象的方法
自定义初始化对象,在自定义管理器类中,自定义一个添加方法,此方法可以接受参数。第一步根据模型类实例化一个对象,第二步,给实例化对象赋值,第三步返回是实例化对象给调用管理器的自定义实例方法的的调用者
查询集:就是使用管理器调用过滤方法获得结果集 特点:1. 惰性执行(就是说当你创建好查询机的时候它并不会取访问数据库,当你在调用数据的时候才会去访问数据库) 2、 查询集的结果会被存储起来,如果下次查询相同数据的时候会使用缓存的数据(相同的查询集只能有一个,不然也不会使用缓存,但是他可以使用那个查询集保存下来的数据)
过滤器:对要查询数据的一种筛选
查询集等价于sql语句,因为ORM会把查询集转换成等价的sql语句,过滤器就等价与whhere等条件判断的语句
返回列表的过滤器:
all() 返回所有的数据
filter()返回满足条件的数据,不满足
exclude():返回满足条件之外的数据,就是不包括谁
order_by():返回排序后的数据
返回单个对象的过滤器:
get():返回单个满足条件的对象,找不到或找到多个都会抛出异常,也就是说使用get()只能查到一个值
count():返回当前查询的总数量
aggregate():聚合
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False