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.表中定义一个是否删除字段

 

自定义模型管理器

 

posted @ 2019-07-13 23:55  颗粒成仓  阅读(182)  评论(0编辑  收藏  举报