Django-Models模块

过滤器

  • 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()
            • 删除时,会将该字段设为指定值
    • 级联数据获取
      • 主获取从 隐性属性 默认是级联模型的名字(类名)
      • 从获取主 显性属性 默认是属性名字(字段名)
  • 1 : M
    • Django 中 使用 ForeignKey() 声明
    • 数据获取
      • 主获取从 隐性属性 级联模型_set
        • model_set 继承自 Manager
          • 可进行 all(),filter(),exclude() 等操作
      • 从获取主 显性属性 属性名字(字段名)
  • M : N
    • 关系比较复杂
    • 开发中很少直接使用多对多关系,而是自己维护多对多的关系
    • Django 中 使用 ManyToManyField() 声明
    • 产生关联表的时候会产生单独的关系表
      • 关系表中存储关联表的主键,通过多个外键实现
      • 对外键进行约束 多个外键值不能同时相等(FK1,FK2)
    • 级联数据操作
      • add()
      • remove()
      • clear()
      • set()
    • 级联数据获取
      • 级联模型_set
        • model_set 继承自 Manager
          • 可进行 all(),filter(),exclude() 等操作

模型继承

  • Django支持模型继承

  • 需要在父类中使用元信息将父类抽象化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class 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)
坚持原创技术分享,您的支持将鼓励我继续创作!