Django项目总结:Model 和 ORM
【准备】
打开项目 =》配置解释器
将App注册到settings中
(访问点HOSTS,APPS,建模板t =》DIRS+路径,数据库 =》mysql)
创库:mysql> create database GP1DjangModel charset=utf8;
伪装驱动:__init__.py
执行迁移:python manage.py migrate
添加数据库
Model
-- 在企业开发中,通常从数据开始开发
-- 开发流程
-- 配置数据库
-- 定义模型类(一个模型类对应数据库的一张表)
-- 生成迁移文件
-- 执行迁移,生成数据表
-- 使用模型类进行增删改查(GRUD)操作
ORM(Object Relational Mapping)对象关系映射
-- 一种程序技术
-- 用于实现面向对象编程语言里不同类型系统的数据之间的转换
-- 相当于翻译机
-- 核心思想解耦合
-- 将业务逻辑和SQL进行了解耦
【Django定义模型】
-- 概念:模型,表,属性,字段
-- 对应关系
-- 一个模型类 => 数据库中一张表
-- 模型类中定义的属性 => 对应该模型对照表中的一个字段(列)
-- 字段(列)数据类型:字符串,数字,时间
-- 定义属性
-- 创建模型类
-- 元选项(类中类),在模型类中定义Meta,用于设置元信息
python manage.py makemigrations
python manage.py migrate
urls.py
【模型成员 objects】
-- Django默认通过模型的 objects 对象实现模型数据查询
-- Django有两种过滤器用于筛选记录
-- filter:返回符合筛选条件的数据集
-- exclude:返回不符合筛选条件的数据集
-- 多个filter和exclude可以连接在一起查询
-- 连续使用,链式调用
-- Person.objects.fiter().filter().xxx.exclude().exclude().yyy
templates => person_list.html
views.py
pers是一个查询结果集,QuerySet
过滤条件
方法
-- 对象方法
-- 可以调用对象的属性,也可以调用类的属性
-- 类方法
-- 不能调用对象属性,只能调用类属性
-- 静态方法
-- 不能调用对象属性,也不能调用类属性
-- 寄生在类上
【创建对象】
-- 目的:向数据库中添加数据
-- save()
-- 创建对象时,调用save()方法,才会将对象保存到数据库中
-- __init__已经在父类models.Model中使用,自定义模型中不能使用
-- 创建对象方案
-- 在模型类中增加类方法去创建对象
@classmethod
def create(cls, name, age):
-- 在定义的管理器中添加方法来创建对象
状态码
-- 2xx -> 请求成功
-- 3xx -> (请求)转发或重定向
-- 4xx -> 客户端错误
-- 5xx -> 服务器错误
【返回单个数据】
-- get():返回一个满足条件的对象
-- 没有找到符合条件的对象,会引发 模型类.DoesNotExist异常
-- 找到多个,会引发 模型类.MultiObjectsReturned 异常
-- first():返回查询集中的第一个对象
-- last():返回查询集中的最后一个对象
-- count():返回当前查询集中的对象个数
-- exists():判断查询集中是否有数据,如果有数据返回True没有反之
验证count(),同exists(),用来辅助判断
表中添加用户密码
检验用户密码登陆
-- 限制查询集,类似切片
-- 使用下标的方法进行限制
-- 和python中的切片不太一样
-- studentList = Student.objects.all()[0:5] 下标不能是负数
-- 相当于SQL中的 limit 和 offset
-- 查询集的缓存
-- 每个查询集都包含一个缓存,来最小化对数据库的访问
-- 在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存,django会将查询出来的数据做一个缓存,并返回查询结构,以后的查询直接使用查询集的缓存。
-- filter,exclude,all都不会真正去查询数据库
-- 只有迭代结果集,或获取单个对象属性时,才会去查询数据库
-- 懒查询
-- django中查询条件有时区问题
-- 关闭django中自定义的时区
-- setting =》USE_TZ =False
-- 在数据库中创建对应的时区表
跨关系查询
-- 模型类名__属性名__比较运算符
-- 实际上就是处理的数据库中的join
-- grade = Grade.objects.filter(student__scontend__contains='小明')
-- 描述中带有'小明'这三个字的数据属于哪个班级
聚合函数
-- 使用aggregate()函数返回聚合函数的值
-- Avg:平均值
-- Count:数量
-- Max:最大
-- Min:最小
-- Sum:求和
-- Student.objects().aggregate(Max('sage'))
F对象
-- 可以使用模型的A属性与B属性进行比较
-- grades = Grade.objects.filter(ggirlnum__gt=F('gboynum') )
-- F对象支持算数运算
-- grades = Grade.objects.filter(ggirlnum__gt=F('gboynum') +10 )
-- 可以获取我们属性的值
-- 可以实现一个模型的不同属性的运算操作
-- 支持算术运算
Q对象
-- 可以对条件进行封装
-- 过滤器的方法中的关键参数,常用于组合条件
-- Q对象语法支持逻辑运算 | (or), & (and), ~(取反)
-- Student.objects.filter(Q(sage__lt=25)) # 年龄小于25
-- Student.objects.filter(~Q(sage__lt=25)) # 年龄大于等于25
【模型成员】
-- 显性属性
-- 开发者手动书写的属性
-- 隐形属性
-- objects 是Manager类型的一个对象,用于数据库交互
-- 不是开发者写的,ORM自动生成的
-- 当模型类没有指定管理器的时候,Django会自动为我们创建模型管理器
-- 如果把隐形属性手动声明了,系统就不会产生隐形属性
-- 模型管理器
-- 是Django的模型与数据库进行交互的接口
-- 一个模型可以有多个模型管理器
-- 自定义模型管理器的作用
-- 可以向管理器中添加额外的方法
-- 修改管理器返回的原始查询集
-- 提供创建对象的方式
1.自定义管理器对象后,默认 objects 失效
报错信息
2.表中定义一个是否删除字段
自定义模型管理器