ORM(Object relational mapping 对象关系映射)

D:把面向对象中的类和数据库表一一对应起来,在django项目与数据库之间起着桥梁的

角色

E:通过操作类和对象,对数据库表实现数据的增删改查等操作,而不需要写SQL语句

使用ORM可以通过方便的配置,切换使用不同的数据库

U:①使用django进行数据库开发步骤:

1. 在models.py中定义模型类(生成表名为应用名_模型类名小写)

2. 生成迁移文件: python manage.D呃py makemigrations

3. 执行迁移生成数据库表(默认使用sqlite3数据库,生成的数据库名为:db.sqlite3): python manage.py migrate

4. 安装sqliteman:sudo apt-get install sqliteman;启动:sqliteman

5. 通过模型类和对象,对数据进行增删改查

通过ORM对数据库增删改:

可以进入交互模式执行代码:python manage.py shell

创建模型类对象:a = 模型类()

增/改:a.save()   --------不指定id则默认使用上一次id,第一次为1,如果指定id,id不存

在则添加数据,id存在则修改数据,如id =None,则id=上一次id+1

删除:a.delete()  --------不指定id即删除本次id

字段属性(即数据表中对应的字段):

属性名 = models.字段类型(字段限制)  ------属性名不可以用python关键字及双下划线

字段类型:

字段类型

类型含义

描述

AutoField

自动增长的整数字段

通常不需要指定,Django会自动创建属性名为id的自动增长属性

BooleanField

布尔字段

值为True或False

NullBooleanField

空布尔字段

支持Null、True、False三种值。

CharField

字符串字段

必须指定参数(max_length=字符个数)

TextField

大文本字段

一般超过4000个字符时使用

DateField,TimeField,DateTimeField

日期,时间,日期时间字段

可指定参数auto_now=False(True:保存对象,django自动为该属性赋值,默认为False);auto_now_add(True:第一次创建,django自动为该属性赋值,默认为False)

IntegerField

整数字段

从 -2147483648 到 2147483647 范围内的值是合法的

DecimalField

十进制浮点数

必须指定参数(max_digit=总位数,decimal_places=小数后位数)

FloatField

浮点数

用python中的float来表示,有误差

FileField

上传文件字段

ImageField

图片字段

继承于FileField,对上传的内容进行校验,确保是有效的图片

字段选项(即数据表中字段限制):

选项

默认值

描述

是否要重新迁移修改表结构

null

False

True:数据库中字段允许为空

unique

False

True:值必须唯一

db_column

属性名称

字段名,如果未指定,则使用属性的名称

db_index

False

True:为此字段创建索引。 查看索引:show index from 表名

primary_key

False

True:则该字段会成为模型的主键字段,一般作为AutoField的选项使用

default

为字段设置默认值

blank

False

True:html页面表单验证时字段允许为空

通过ORM查询数据库:

objects(模型管理器)

D:每个模型类都有一个objects的类属性,由django字段生成

E:查询数据库的数据或对数据进行操作处理

U:objects中的方法:

objects管理器中的方法

返回类型

作用

模型类.objects.get()

模型对象

返回一个对象,且只能有一个:如果查到多条数据,则报:MultipleObjectsReturned如果查询不到数据,则报:DoesNotExist

模型类.objects.filter()

QuerySet

返回满足条件的对象

模型类.objects.all()

QuerySet

返回所有的对象

模型类.objects.exclude()

QuerySet

返回不满条件的对象

模型类.objects.order_by()

QuerySet

对查询结果集进行排序

模型类.objects.aggregate()

字典,例如:{'salary__avg': 9500.0}

进行聚合操作Sum, Count, Max, Min, Avg

模型类.objects.count()

数字

返回查询集中对象的数目

filter方法

D:模型管理器objects的一种查询方法

E:实现条件查询,返回QuerySet对象,包含了所满足条件的数据

U:模型类.objects.filter(模型类属性名__条件名 = 值)

filter条件:

条件

含义

注释

exact

判等

可以省略

contains;endswith;startswith

模糊查询

包含;以什么开头;结尾

isnull

空查询

是否为空,是返回True,否返回False

in

范围查询

在....内

gt,lt,gte,lte

比较查询

大于,小于,大于等于,小于等于

year, date

日期查询

年,日期

查询的其他方式

方法

作用

示例

F对象

引用某字段的值,对比表中的两个字段

查询语文分数大于数学分数的学生成绩表.objects.filter(语文__gt=F('数学'))

Q对象

组合多个查询条件,通过(&,|,~)进行逻辑操作

Q(条件1)逻辑操作符 Q(条件2)

order_by

对查询结果进行排序(默认升序)

升序: 模型类.objects.order_by('字段名')降序: 模型类.objects.order_by('-字段名')

aggregate

聚合操作,对多行查询结果中的一列进行操作,返回一个值。(有Sum,Count,Max,Min,Avg)

模型类.objects.aggregate(聚合类('模型属性'))返回值是一个字典,格式: {'属性名__聚合函数': 值}

count

统计满足条件的对象的个数,返回值是一个数字

模型类.objects.count()

查看orm语句

打开mysqld.cnf

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

重启mysql服务

sudo service mysql restart

查看mysql日志内容

sudo tail -f /var/log/mysql/mysql.log

QuerySet查询集

D:调用模型管理器的all, filter, exclude, order_by方法会产生一个QuerySet

E:先过滤得到该查询集还可以调用objects的方法操作数据

U:①取下标操作(下标不允许负数):b[0]取出QuerySet的第一条数据,如果不存在则

抛异常

②切片操作(下标不允许负数):产生新的QuerySet

③get():取出QuerySet的唯一一条数据,不存在或者多条则抛异常

④exsit():判断是否有数据

⑤改,删数据库数据:QuerySet对象.update(属性1=值1),QuerySet.delete()

特性:①惰性查询:只有在使用QuerySet中的数据时,才会取查询数据库中的数据

②缓存:第一次遍历QuerySet中的所有对象,django会把数据缓存起来,第二次再使用时会使

用缓存,不会再次查询。

一对多关联查询

由一类的条件查询多类数据

1.   一类对象 = 一类类名.objects.get(条件)

一类对象.多类类名小写_set.all()

2.  多类类名.objects.filter(一类类名小写__一类属性名__条件 = 值)

由多类的条件查询一类数据

1.   多类对象 = 多类类名.objects.get(条件)

多类对象.关联属性

2.   一类类名.objects.filter(多类类名小写__多类属性名__条件 =值 )

自关联

D:是一种特殊的一对多关系

U:自关联关联属性定义:关联属性 = models.ForeignKey('self')

自定义模型管理器

D:在模型类中自定义模型管理器,自定义后,Django将不再生成默认的objects

E: 功能1:修改管理器返回的原始查询集

功能2:在管理器类中添加额外的方法,帮助我们操作模型类对应的数据表,减轻视

图函数中的代码量,主要做逻辑处理。

U:①在views创建一个自定义模型管理器类,继承Manager

②重写父类的方法修改管理器返回的原始查询集

③把操作数据库的代码实现封装到模型管理器的方法中,返回模型类对象

④在原模型类中:objects=自定义模型管理器类名()    实现功能1