过滤器
- all()
- 返回所有数据
- filter()
- 返回符合条件的数据
- exclude()
- 过滤掉符合条件的数据
- order_by()
- 排序
- values()
- 一条数据就是一个字典,返回一个列表
- first()
- 返回查询集中的第一个对象
- last()
- 返回查询集中的最后一个对象
- 隐藏bug:可能会出现 first() 和 last() 返回相同对象(解决办法:手动写排序规则)
- count()
- 返回当前查询集的对象个数
- exists()
- 判断当前查询集是否有对象
- get()
- 返回一个满足条件的对象
- 如果没有找到符合条件的对象,会抛出 模型类.DoesNotExist 异常
- 如果找到多个符合条件的对象,会抛出 模型类.MultiObjectsReturned 异常
数据集切片
- QuerySet[0:15] 获取第0条到第14条数据
- 相当于SQL中的 limit 和 offset
- 和python中的切片不太一样,不能用负数
查询条件
- 表达式:属性名__运算符 = 值
- 运算符
- gt 大于
- lt 小于
- gte 大于等于
- lte 小于等于
- in 在某一个集合中
- contains 类似于 模糊查询 like
- startswith 以xx开始 本质是like
- endswith 以xx结束,也是like
- exact 精确搜索 类似等于
- 前面运算符同时添加 i (ignore 忽略)
- iexact
- icontains
- istartswith
- iendswith
- 解决 django 中查询条件存在的时区问题
- 关闭django中自定义的时区
- 在数据库中创建对应的时区表
python方法
- 对象方法
- 可以调用对象属性,也可以调用类的属性
- 类方法
- 不能调用对象属性,只能调用类的属性
- 静态方法
- 不能调用对象属性,也不能调用类的属性
- 只是寄生在类上而已
F 对象
- 可以获取我们属性的值
- 可以实现一个模型的不同属性之间的运算操作
- 支持算术运算
Q 对象
- 可以对查询条件进行封装
- 支持逻辑运算
- 与 & and
- 或 | or
- 非 ~ not
字段约束
- max_length
- default
- unique
- index
- primary_key
- db_column
模型成员
- 显性属性
- 开发者手动声明的属性
- 隐性属性
- 开发者没有声明,父类中也不存在,动态产生出来的
- 如果开发者主动声明这些属性,隐性属性就不会自动生成
重要数据处理(软删除,逻辑删除)
- 模型类中创建逻辑字段 is_delete
- 自定义Manager类实现统一封装
- 重写get_queryset
模型关系
- 1 : 1
- 应用场景
- 用于复杂表的拆分
- 扩展新功能
- Django 中 使用 OneToOneField() 声明
- 使用时,关系声明位置有细微差别
- 实现原理
- 通过外键实现的
- 且对外键添加唯一约束
- 数据删除
- 级联表
- 主表(被动声明关系的是主表)
- 从表(主动声明关系的是从表)
- on_delete
- CASECADE
- 从表数据删除,主表不受影响
- 主表数据删除,从表的级联数据也会删除
- PROTECT
- 开发中为了防止误删除,我们通常设置此模式
- 主表如果存在级联数据,主表的删除操作会受到保护,不能删除
- 主表不存在级联数据,主表的删除操作可以成功
- SET
- SET_NULL
- 使用前提,字段允许为NULL
- 删除时,会将该字段设为NULL
- SET_DEFAULT
- 使用前提,字段有设置默认值
- 删除时,会将该字段设为默认值
- SET()
- 删除时,会将该字段设为指定值
- SET_NULL
- CASECADE
- 级联表
- 级联数据获取
- 主获取从 隐性属性 默认是级联模型的名字(类名)
- 从获取主 显性属性 默认是属性名字(字段名)
- 应用场景
- 1 : M
- Django 中 使用 ForeignKey() 声明
- 数据获取
- 主获取从 隐性属性 级联模型_set
- model_set 继承自 Manager
- 可进行 all(),filter(),exclude() 等操作
- model_set 继承自 Manager
- 从获取主 显性属性 属性名字(字段名)
- 主获取从 隐性属性 级联模型_set
- M : N
- 关系比较复杂
- 开发中很少直接使用多对多关系,而是自己维护多对多的关系
- Django 中 使用 ManyToManyField() 声明
- 产生关联表的时候会产生单独的关系表
- 关系表中存储关联表的主键,通过多个外键实现
- 对外键进行约束 多个外键值不能同时相等(FK1,FK2)
- 级联数据操作
- add()
- remove()
- clear()
- set()
- 级联数据获取
- 级联模型_set
- model_set 继承自 Manager
- 可进行 all(),filter(),exclude() 等操作
- model_set 继承自 Manager
- 级联模型_set
模型继承
Django支持模型继承
需要在父类中使用元信息将父类抽象化
1
2
3
4
5
6
7
8
9
10
11class Father(models.Model):
name = models.CharField(max_length=16)
# 抽象
class META:
abstract = True
class Son1(Father):
sex = models.BooleanField(default=False)
class Son2(Father):
adult = models.BooleanField(default=False)