# Models模型
- ORM
- ObjectRelationMap:把面向对象思想转换成关系型数据库,操作上把类当成数据库里的一张表
- 类对应表格
- 类中的属性对应表中的字段
- 在应用中的models.py文件中定义class
- 所有需要使用ORM的class都必须是models.Model的子类
- class中所有属性对应表格中的字段
- 字段的类型都必须使用modles.xxx不能使用python中的类型
- 在django中,Models负责跟数据库交互
- django链接数据库
- 自带默认数据库sqlite3
- 关系型数据库
- 轻量级
- 单文件数据库,很小
- 建议开发用sqlite3,实际部署用mysql子类数据库,下面是如何切换mysql数据库的步骤
- 1、切换数据库在setting中设置
# django链接mysql
DATABASE = [
'default' : {
'ENGINE':'django.db.backends.mysql',
'NAME':'数据库名',
'PASSWORD':'数据库密码',
'HOST':'127.0.0.1',
'PORT':'3306',
}
]
- 2、需要在项目文件下的__init__.py文件中导入pymysql包
'''
# 在主项目的__init__.py文件中
import pymysql
pymysql.install_as_MySQLdb()
'''
# models类的使用
- 定义和数据库表映射的类
- 在应用中的models.py文件中定义class
- 所有需要使用ORM的class都必须是models.Model的子类
- class中所有属性对应表格中的字段
- 字段的类型都必须使用modles.xxx不能使用python中的类型
- 字段常用参数
1、max_length:规定数值的最大长度
2、blank:是否允许字段为空,默认不允许
3、null:在DB中控制是否保存为null,默认为false
4、default:默认值
5、unique:唯一
6、verbose_name:假名
- 数据库的迁移(在models里创建类后通知数据库)
1、在命令行中,生成数据迁移的语句(生成sql语句)
python manage.py makemigrations
2、在命令行中,输入数据迁移的指令
python manage.py migrate
如果迁移中没有变化或者报错,可以强制迁移
1、python manage.py makemigrations 应用名
2、python manage.py migrate 应用名
对于默认数据库,为了避免出现混乱,前提是数据库中没有数据,可以删除自定义app下的migrations文件夹和db.sqlites3数据库
- 查看数据库中的数据
1.启动命令行:python manage.py shell
注意点:对orm的操作分为静态函数和非静态函数两种,静态函数是指在内存中类共用的,非静态函数是指每个实例掌握的
2.在命令行中导入对应的映射类
from 应用.models import 类名
3.使用object属性操作数据库,object是模型中实际和数据进行交互的
4.查询命令
类名.objects.all()查询数据库表中的所有内容,返回的结果是一个QuerySet查询集合类型
类名.object.filter(条件)
常见查找方法
1、通用查找格式:属性名__条件符号=值
条件符号有:
gt:大于
gte:大于等于
lt:小于
lte:小于等于
range:范围
year:年份
isnull:是否为空
2、查找等于指定值的格式:属性名=值
3、模糊查找:属性名__查找方式=值
查找方式有:
exact:精确等于
iexact:不区分大小写
contains:包含
startwith:以..开头
endwith:以..结尾
- 数据库表关系
- 多表联查:利用多个多联合查找某一项信息或者多项信息
- 1:1 OneToOne
- 建立关系:在模型任意一边即可,使用OneToOneField
- add:
1、create方法,返回类型是<class 'rlt.models.Manager'>
2、实例化方法,直接实例化保存,推荐这种方法
- query:
- 由子表查母表(定义关系的表叫子表),由子表的属性直接提取信息
- 由母表查子表,使用双下划线
- change:
- 单个修改后使用save保存
- 批量修改使用update
- 无论是对子表还是母表修改方法都一样
- delete:直接使用delete删除
- 1:N OneToMany
- 一个表格的一个数据项/对象等,可有很多个另一个表格的数据项
- 比如,一个学校可有很多个老师,一般一个老师只会在一个学校上课
- 使用上
- 使用ForeignKey
- 在多的那一边,比如上面的例子就是在Teacher表格里进行定义
- add:
- 跟一对一方法类似,通过cerate和new来添加
- create:把属性都填满,然后不需要手动保存
- new:可以属性或者参数为空,必须用save保存
- query:
- 以学校和老师举例
- 如果知道老师,查学校,则通过增加的关系属性,直接使用
- 反查
- 由学校,想查下这个学校所有老师,则在学校后跟老师这个类(类名称小写)接下划线set来表示
- 可以简单理解成teacher_set是School类里的一个隐藏属性
- N:N ManyToMany
- 两表之间相互拥有对方表格里的多项数据
- 比如典型例子就是老师和学生,老师可以有多个学生,学生也可以有多个老师
- 使用上,在任意一方,使用ManyToMany定义,只需要定义一边
- add:
- 添加老师,则在Student实例.teachers.add(),也可以用create方法
- query:
- 跟一对多类似,使用set查询