Django 之 Models(Models 模型 & 数据表关系)
Models 模型
ORM
ObjectRelationMap: 把面向对象思想转换成关系数据库思想,操作上把类等价于表格
类对应表格
类中的属性对应表中的字段
在应用中的 models.py 文件中定义 class
所有需要使用 ORM 的 class 都必须是 models.Model 的子类
class 中的所有属性对应表格中的字段
字段的类型都必须使用 modles.xxx 不能使用 python 中的类型
在 django 中,Models 负责跟数据库交互
django 连接数据库
自带默认数据库 Sqlite3
关系型数据库
轻量级
建议开发用 splite3,部署用 mysql 之类数据库
切换数据库在 settings 中进行设置
需要在项目文件下的__init__文件中导入 pymysql 包
models 类的使用
定义和数据库表映射的类
在应用中的 models.py 文件中定义 class
所有使用 ORM 的 class 都必须是 models.Models 的子类
class 中的所有属性对应表格中的字段
字段的类型都需使用 models.xxx 不能使用 python 中的类型
字段常用参数
max_length: 规定数值的最大长度
blank: 是否允许字段为空,默认不允许
null: 在 DB 中控制是否保存为 null,默认为 False
default: 默认值
unique: 唯一
verbose_name: 假名
数据库的迁移
在命令行中,生成数据迁移的语句(生成 sql 语句)
在命令行中,输入数据库迁移的指令
对于默认数据库,为了避免出现混乱,如果数据库中没有数据,每次迁移前可以把系统自带的 sqlite3 数据库删除
数据相关操作
查看数据库中的数据
查找数据
添加数据
常见查找方法
通用查找格式: 属性名 _ _ (用下面的内容) =值
gt : 大于
gte : 大于等于
lt : 小于
lte : 小于等于
range: 范围
year : 年份
isnull : 是否为空
查找等于指定值的格式: 属性名 = 值
模糊查找: 属性名 _ _ (使用下面的内容) = 值
exact : 精确等于
iexact: 不区分大小写
contains: 包含
startwith: 以..开头
endwith: 以…结尾
数据库表关系
多表连查:利用多个表联合查找莫一项信息或多项信息
models.py
1:1 OneToOne
建立关系:在模型任意一边即可,使用 OneToOneField
add
添加没有关系的一边,直接实例化保存就可以
添加有关系的一边,使用 create 方法
query
由子表查母表: 由子表的属性直接提取信息
由母表标查子表:使用双下划线
change
单个修改使用 save
批量修改使用 update
无论对子表还是母表的修改
delete: 直接使用 delete
1:N OneToMany
一个表格的一个数据项/对象等,可以有很多个另一个表格的数据项
比如:一个学校可以有很多老师,但一个老师只能在一个学校上班
使用上
使用 ForeignKey
在多的那一边,比如上边的例子就是在 Teacher 的表格里进行定义
add
跟一对一方法类似,通过 create 和 new 来添加
create:把属性都填满,然后不需要手动保存
new: 可以属性或者参数为空,必须用 save 保存
query
以学校和老师的列子为准
如果知道老师, 查学校,则通过增加的关系属性,直接使用
例如,查询 t1 老师是哪个学校的
反查
查询学校所有的老师,则系统自动在学校模型下添加属性
N:N ManyToMany
表示任意一个表的数据可以拥有对方表格多项数据,反之亦然
比如典型例子就是老师和学生的关系
使用上,在任意一方,使用 ManyToMany 定义,只需要定义一边
add
添加老师,则在 student.teachers.add()
query
跟一对多类似,使用_set 查询
版权声明: 本文为 InfoQ 作者【若尘】的原创文章。
原文链接:【http://xie.infoq.cn/article/fe2feaaad017624e460ff3f90】。文章转载请联系作者。
评论