- # Models 模型
- - ORM
- ObjectRelationMap : 把面向对象思想转换成关系数据库思想. 操作上把类等价于表格
- 类对应表格
- 类中的属性对应表中的字段
- 在应用中的 models.py 文件中定义 class
- 所有需要使用 ORM 的 class 都必须是 models.Model 的子类
- class 中的所有属性对应表格中的字段
- 字段的类型都必须使用 modles.xxx 不能使用 python 中的类型
- 在 django 种, Models 负责跟数据库交互
- django 链接数据库
- 自带默认数据库 Sqllite3
- 关系型数据库
- 轻量级
- 建议开发用 sqlite3, 部署用 MySQL 之类数据库
- 切换数据库在 settings 中进行设置
- # django 连接 MySQL
- DATABASES = [
- 'default' = {
- 'ENGINE' : 'django.db.backends.mysql',
- 'NAME' : '数据库名',
- 'PASSWORD': '数据库密码',
- 'HOST': '127.0.0.1',
- 'PORT': '3306',
- }
- ]
- 需要在项目文件下的__init__文件中导入 pymysql 包
- ```
- # 在主项目的__init__文件中
- 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 : 假名
- 数据库的迁移
1. 在命令行中, 生成数据迁移的语句 (生成 sql 语句)
- ```
- python3 manage.py makemigrations
- ```
2. 在命令行中, 输入数据迁移的指令
- ```
- python3 manage.py migrate
- ```
ps : 如果迁移中出现没有变化或者报错, 可以尝试强制迁移
- ```
- # 强制迁移命令
python3 manage.py makemigrations 应用名
python3 manage.py migrate 应用名
```
3. 对于默认数据库, 为了避免出现混乱, 如果数据库中没有数据, 每次迁移前可以把系统
自带的 sqlite3 数据库删除
- # 1. 查看数据库中的数据
- ```
1. 启动命令行 : python3 manage.py shell
ps: 注意点: 对 ORM 的操作分为静态函数和非静态函数两种. 静态是指在内存中只有一份内容存在, 调用的时候使用 类名. 的方式. 如果修改了那么所有使用的人都会受影响.
2. 在命令行中导入对应的映射类
from 应用. models import 类名
3. 使用 objects 属性操作数据库. objects 是 模型中实际和数据库进行交互的 Manager 类的实例化对象.
4. 查询命令
- 类名. objects.all() 查询数据库表中的所有内容. 返回的结果是一个 QuerySet 类型, 实际上是类列表中装这个一个一个数据对象.
- 类名. objects.filter(条件)
- ```
- ```
- # from 应用名. models import 类名
- from myapp.models import Student
- # 查询 Student 表中的所有数据, 得到的是一个 QuerySet 类型
- Student.objects.all()
- # 如果要取出所有 QuerySet 类型中的所有数据对象, 需要遍历取出所有的对象, 再用对象. 属性来查看值
- s = Student.object.all()
- for each in s:
- print(each.name , each.age , each.address , each.phone)
- # 如果要进行过滤筛选, 使用 filter() 方法
- Student.objects.filter(age=18)
- ```
- # 2. 添加数据
- ```
对象 = 类 () # 使用类实例化对象
对象. 属性 = 值 # 给对应的对象的属性赋值
对象. save() # 必须要执行保存操作, 否则数据没有进入数据库
```
python3 manage.py shell 命令行中添加数据
- ```
- # from 应用名. models import 类名
- from myapp.models import Student
- # 实例化对象
- s = Student()
- # 给对象的属性赋值
- s.name = '张三'
- s.address = '云南昭通'
- s.phone = '13377886678'
- s.age = 20
- # 保存数据
- s.save()
- ```
- 常见查找方法
1. 通用查找格式: 属性名 _ _ (用下面的内容) = 值
- gt : 大于
- gte : 大于等于
- lt : 小于
- lte : 小于等于
- range: 范围
- year : 年份
- isnull : 是否为空
2. 查找等于指定值的格式: 属性名 = 值
3. 模糊查找: 属性名 _ _ (使用下面的内容) = 值
* exact : 精确等于
* iexact: 不区分大小写
* contains: 包含
* startwith: 以.. 开头
* endwith: 以... 结尾
# 数据库表关系
- 多表联查: 利用多个表联合查找某一项信息或者多项信息
- 1:1 OneToOne
- 建立关系: 在模型任意一边即可, 使用 OneToOneField
- add:
- 添加没有关系的一边, 直接实例化保存就可以
- >>> s = School()
- >>> s.school_id = 2
- >>> s.school_name = "nanjingtulingxueyuan"
- >>> s.save()
- 添加有关系的一边, 使用 create 方法, 或者使用实例化然后 save
- # 方法 1
- >>> m = Manager()
- >>> m.manager_id = 10
- >>> m.manager_name = "dana"
- >>> m.my_school = s
- >>> m.save()
- # 方法 2
- >>> m = Manager.objects.create(manager_id=20, manager_name="erna", my_school=ss[0])
- - query:
- 有子表查母表: 由子表的属性直接提取信息
- 由母表查子表: 使用双下划线
- >>> s = School.objects.get(manager__manager_name="dana")
- >>> s
- <School: nanjingtulingxueyuan>
- - change:
- 单个修改使用 save
- 批量修改使用 update
- 无论对子表还是对母表的修改
- delete: 直接使用 delete 还是删除
- 1:N OneToMany
- 一个表格的一个数据项 / 对象等, 可以有很多个另一个表格的数据项
- 比如: 一个学校可以有很多个老师, 但一个老师只能在一个学校里上班
- 使用上
- 使用 ForengnKey
- 在多的那一边, 比如上边的例子就是在 Teacher 的表格里进行定义
Add:
- 跟一对一方法类似, 通过 create 和 new 来添加
- create: 把属性都填满, 然后不需要手动保存
- new: 可以属性或者参数为空, 必须用 save 保存
Query:
- 以学校和老师的例子为准
- 如果知道老师, 查学校 , 则通过增加的关系属性, 直接使用
- 例如, 查找 t1 老师是哪个学校的
- 反查 =
- 有学校, 我想查下这个学校所有老师, 则系统自动在老师模型名称的小写下直接加下划线 set,
用来表示
- N:N ManyToMany
- 表示任意一个表的数据可以拥有对方表格多项数据, 反之亦然
- 比如典型例子就是老师和学生的关系
- 使用上, 在任意一方, 使用 ManyToMany 定义, 只需要定义一边
- Add:
- 添加老师, 则在 student.teachers.add()
- Query:
- 跟一对多类似, 使用_set 查询
来源: http://www.bubuko.com/infodetail-3055066.html