Python Django Model 模型

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
  • 映射到库中:生成迁移文件、执行迁移
    • 前提:数据库配置完毕
      • 默认配置的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
  • 属性
    • 显性属性:开发者手动声明的属性
    • 隐性属性:没有声明,父类中也不存在,动态产生出来的;如果开发者主动声明了这些属性,隐性属性自己就不再生成了
  • 重要数据处理
    • 逻辑字段
    • is_delete
    • 自定义Manager实现统一封装--重写get_queryset
  • 数据库中数据类型
    • 字符串
    • 数字
    • 日期时间
  • 方法
    • 对象方法
      • 可以调用对象的属性,也可以调用类的属性
    • 类方法
      • 不能调用对象属性,只能调用类属性
    • 静态方法
      • 不能调用,不能获取对象属性,也不能获取类属性
      • 只是寄生在我们这个类而已
  • 状态码
    • 2XX
      • 请求成功
    • 3XX
      • 转发或重定向
    • 4XX
      • 客户端错误
    • 5XX
      • 服务器错误
      • 后端开发人员最不想看到的
  • 获取单个对象
    • 查询条件没有匹配的对象,会抛出异常,DoesNotExist
    • 如果查询条件对应多个对象,会抛出异常,MultipleObjectsReturned
  • First和Last
    • 默认情况下可以正常从QuerySet中获取
    • 隐藏Bug
      • 可能会出现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)
  • 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章