写点什么

Django 之 Models(Models 模型 & 数据表关系)

用户头像
若尘
关注
发布于: 2021 年 05 月 28 日
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 包


           # 在主项目的__init__文件中
import pymysql pymysql.install_as_MySQLdb()
复制代码

models 类的使用

定义和数据库表映射的类



  • 在应用中的 models.py 文件中定义 class

  • 所有使用 ORM 的 class 都必须是 models.Models 的子类

  • class 中的所有属性对应表格中的字段

  • 字段的类型都需使用 models.xxx 不能使用 python 中的类型

字段常用参数



  • max_length: 规定数值的最大长度

  • blank: 是否允许字段为空,默认不允许

  • null: 在 DB 中控制是否保存为 null,默认为 False

  • default: 默认值

  • unique: 唯一

  • verbose_name: 假名

数据库的迁移



  1. 在命令行中,生成数据迁移的语句(生成 sql 语句)

  2. 在命令行中,输入数据库迁移的指令

  3. 对于默认数据库,为了避免出现混乱,如果数据库中没有数据,每次迁移前可以把系统自带的 sqlite3 数据库删除

数据相关操作

查看数据库中的数据

1. 启动命令行: python3 manage.py shellps: 注意点: 对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)
复制代码

添加数据

对象 = 类()   # 使用类实例化对象对象.属性 = 值  # 给对应的对象的属性赋值对象.save()  # 必须要执行保存操作,否则数据没有进入数据库

# python3 manage.py shell 命令行中添加数据
# from 应用名.models import 类名
from myapp.models import Student
# 实例化对象s = Student()
# 给对象的属性赋值s.name = 'ruochen's.address = 'xxx's.phone = '18888888888's.age = 18
# 保存数据s.save()
复制代码

常见查找方法

  1. 通用查找格式: 属性名 _ _ (用下面的内容) =值

  2. gt : 大于

  3. gte : 大于等于

  4. lt : 小于

  5. lte : 小于等于

  6. range: 范围

  7. year : 年份

  8. isnull : 是否为空

  9. 查找等于指定值的格式: 属性名 = 值

  10. 模糊查找: 属性名 _ _ (使用下面的内容) = 值

  11. exact : 精确等于

  12. iexact: 不区分大小写

  13. contains: 包含

  14. startwith: 以..开头

  15. endwith: 以…结尾


# 查找年龄大于18的老师ta = Teacher.objects.filter(age__gt=18)
# 小于20ta = Teacher.objects.filter(age__lt=20)
# 查找course中包含a字母的老师ta = Teacher.objects.filter(course__contains="a")
复制代码

数据库表关系

  • 多表连查:利用多个表联合查找莫一项信息或多项信息

  • models.py


from django.db import models
# Create your models here.
class School(models.Model): school_id = models.IntegerField() school_name = models.CharField(max_length=20) # teacher_set # my_manager = models.OneToOneField("Manager")
def __str__(self): return self.school_name
class Manager(models.Model): manager_id = models.IntegerField() manager_name = models.CharField(max_length=20)
# 建立一对一关系 my_school = models.OneToOneField(School)
def __str__(self): return self.manager_name
class Teacher(models.Model): teacher_name = models.CharField(max_length=20) my_school = models.ForeignKey("School")
class Student(models.Model): student_name = models.CharField(max_length=20) teachers = models.ManyToManyField("Teacher")
复制代码

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 查询

发布于: 2021 年 05 月 28 日阅读数: 12
用户头像

若尘

关注

还未添加个人签名 2021.01.11 加入

还未添加个人简介

评论

发布
暂无评论
Django 之 Models(Models 模型 & 数据表关系)