Model 模型 创建数据库表
- 数据操作封装
- 定义数据表结构
- 模型类、表、属性、字段
- 定义模型
- 继承自Model
- class Meta 源信息
- db_table 表名
- 定义字段
- 字段类型:CharField、TextField、IntegerField、FloatField、BooleanField、DecimalField、NullBooleanField、AutoField、FailField、ImageField
- 字段y约束:max_length、default、unique、index、primary_key、db_column
- 继承自Model
- 映射到库中:生成迁移文件、执行迁移
- 前提:数据库配置完毕
- 默认配置的SQLite
- 自主配置MySQL:引擎、数据库名、用户名、密码、主机、端口、驱动(需要伪装)
- 前提:数据库配置完毕
- ORM(Object Relational Mapping) 对象关系映射
- 将业务逻辑和SQL语句进行了解耦--核心思想解耦合
- 可以理解为翻译机
- CRUD
- CREATE save 创建对象
- 直接实例化对象,设置属性
- 创建对象,传入属性
- 使用Model.Objects.create()
- 自己封装类方法创建
- 在Manager中封装方法创建
- 更新:基于查询 save
- 删除:基于查询 delete
- 查询:查询句柄 objects
- 隐性属性
- Manager实例
- 操作都封装在这里面 获取查询结果集 QuerySet
- all、filter、exclude、order_by、values
- 切片:不支持负数;实际上相当于Limit offset
- 懒查询:观察者模式、发布者订阅者模式、广播
- 获取单个对象
- get (1)不存在会抛异常DoesNotExist (2)存在多于一个MultipleObjectsReturned (3)使用这个函数记得捕获异常
- last
- first:(1)坑点 (2)可能出现第一个和最后一个是一样的 (3)需要主动进行排序
- 条件 属性__操作符=临界值 gt、gte、lt、lte、in、exact、startswith、endswith、contains、ignore(iexact、icontains、istartswith、iendswith)
- 条件升级
- F:获取字段信息、通常用在模型的自我属性比较、支持算数运算
- Q:条件封装、支持逻辑运算(& | ~)
- 内置函数:count、exists
- 聚合函数:操作列、Max、Avg、Min、Sum、Count
- CREATE save 创建对象
- 属性
- 显性属性:开发者手动声明的属性
- 隐性属性:没有声明,父类中也不存在,动态产生出来的;如果开发者主动声明了这些属性,隐性属性自己就不再生成了
- 重要数据处理
- 逻辑字段
- is_delete
- 自定义Manager实现统一封装--重写get_queryset
- 数据库中数据类型
- 字符串
- 数字
- 日期时间
- 方法
- 对象方法
- 可以调用对象的属性,也可以调用类的属性
- 类方法
- 不能调用对象属性,只能调用类属性
- 静态方法
- 不能调用,不能获取对象属性,也不能获取类属性
- 只是寄生在我们这个类而已
- 对象方法
- 状态码
- 2XX
- 请求成功
- 3XX
- 转发或重定向
- 4XX
- 客户端错误
- 5XX
- 服务器错误
- 后端开发人员最不想看到的
- 2XX
- 获取单个对象
- 查询条件没有匹配的对象,会抛出异常,DoesNotExist
- 如果查询条件对应多个对象,会抛出异常,MultipleObjectsReturned
- First和Last
- 默认情况下可以正常从QuerySet中获取
- 隐藏Bug
- 可能会出现first和last获取到的是相同的对象
- 显式,手动写排序规则
- 可能会出现first和last获取到的是相同的对象
- 切片
- 和Python中的切片不同
- QuerySet[5:15] 获取的是第5条到第15条数据
- 相当于SQL中 limit 和 offset
- 缓存集
- filter——过滤符合条件的数据
- exclude——过滤除了条件之外的数据
- 连续使用
- 链式调用
- Person.objects.filter().filter().xxxx.exclude().exclude().yyyy
- all
- 都不会真正的去查询数据库
- 只有我们在迭代结果集,或者获取单个对象属性的时候,它才会去查询数据库
- 懒查询
- 为了优化我们结构和查询
- 查询条件
- 属性_运算符=值
- gt
- lt
- gte
- lte
- in 在某一集合中
- contains 类似于 模糊查询 like
- startswith 以xx开始 本质也是like
- endswith 以xx结束 也是like
- exact
- 前面同时添加,ignore忽略
- iexact
- icontains
- istartswith
- iendswith
- django中查询条件有时区问题
- 关闭django中自定义的时区
- 在数据库中创建对应的时区表
- settings.py中,
USE_TZ = True,如果改为False,则关闭时区
- 聚合函数
- 使用aggregate()函数返回聚合函数的值
- Avg:平均值
- Count:数量
- Max:最大
- Min:最小
- Sum:求和
- 例如:Student.objects().aggregate(Max('sage'))
- F对象
- 可以获取我们的属性值,可以使用模型的A属性与B属性进行比较
- 例:grades = Grade.objects.filter(ggirlnum__gt=F('gboynum'))
- 可以实现一个模型的不同属性的运算操作
- 可以支持算数运算
- 例:grades = Grade.objects.filter(ggirlnum__gt=F('gboynum') + 10)
- 可以获取我们的属性值,可以使用模型的A属性与B属性进行比较
- Q对象
- 可以对条件进行封装,过滤器方法中的关键参数,常用于组合条件
- 例:Student.objects.filter(Q(sage__lt=25)) #年龄小于25
- Student.objects.filter(~Q(sage__lt=25)) #年龄大于等于25
- 封装之后,可以支持逻辑运算
- 与 & and
- 或 | or
- 非 ~ not
- 可以对条件进行封装,过滤器方法中的关键参数,常用于组合条件
- 模型成员
- 显性属性
- 开发者手动书写的属性
- 隐性属性
- 开发者没有书写,ORM自动生成的属性
- 如果将隐性属性手动声明,系统就不会产生隐性属性
- 显性属性
- 模型管理器类
- 模型管理器是Django的模型与数据库进行交互的接口,一个模型可以有多个模型管理器
- 作用
- 可以向管理器中添加额外的方法
- 修改管理器返回的原始查询集
- 提供创建对象的方式
- 例如:
from django.db import models class AnimalManager(models.Model): def get_queryset(self): return super(AnimalManage, self).get_queryset().filter(is_delete=False) def create(self, a_name='Chicken'): a = self.model() a.a_name = a_name return a class Animal(models.Model): a_name = models.CharField(max_length=16) is_delete = models.BoolenField(default=False) a_m = AnimalManager()
models.py中级联
class Grade(models.Model):
g_name = models.CharField(max_length=16)
class Student(models.Model):
s_name = models.CharField(max_length=16)
s_grade = models.ForeignKey(Grade, on_delete=models.CASCADE) #需要添加on_delete=models.CASCADE 级联
快捷键记录:
多用点可以加快编写代码的速度
.re—— 快捷生成return
.if