Django_Day2

Day02

 

 

Model

  • 在企业开发中,我们通常都是从数据开始开发的

 

ORM

  • 对象关系映射

  • 可以理解为翻译机

  • 核心思想,解耦合

    • 将业务逻辑和SQL进行了解耦

 

数据库中数据类型

  • 字符串
  • 数字
  • 日期时间

 

模型过滤

  • filter

  • exclude

  • 连续使用

    • 链式调用
    • Person.objects.filter().filter().xxxx.eclude().exclude().yyyy

 

快捷键

  • .re 快捷生成return
  • . if 多用点看看世界的美好

 

方法

  • 对象方法

    • 可以调用对象的属性,也可以调用类的属性
  • 类方法

    • 不能调用对象属性,只能调用类属性

    • 加了类方法后不用重新迁移

      • 为数据表添加默认值,就可以进行动态修改,不然直接生成的带缺省值的一条记录是无法修改的
      • image-20200131122424471
      • image-20200131122339857
  • 静态方法

    • 啥都不能调用,不能获取对象属性,也不能获取类属性
    • 只是寄生在我们这个类上而已

状态码

  • 2xx

    • 请求成功
  • 3xx

    • 转发或重定向
  • 4xx

    • 客户端错误
  • 5xx

    • 服务器错了
    • 后端开发人员最不想看到的

 

获取单个对象Person.objects.get(p_age=55)

  • 查询条件没有匹配的对象,会抛异常,DoesNotExist
  • 如果查询条件对应多个对象,会抛异常,MultipleObjectsReturned

 

first和last

  • 默认情况下可以正常从QuerySet中获取

  • 隐藏bug

    • 可能会出现 first和last获取到的是相同的对象

      • 显式,手动写排序规则

 

切片

  • 和python中的切片不太一样

  • QuerySet[5:15] 获取第五条到第十五条数据

    • 相当于SQL中limit和offset

缓存集

  • filter

  • exclude

  • all

  • 都不会真正的去查询数据库

  • 只有我们在迭代结果集,或者获取单个对象属性的时候,它才会去查询数据库

  • 懒查询

    • 为了优化我们结构和查询

 

查询条件

  • 属性__运算符=值

  • gt

  • lt

  • gte

  • lte

  • in 在某一集合中

  • contains 类似于 模糊查询 like

  • startswith 以xx开始 本质也是like

  • endswith 以 xx 结束 也是like

  • exact

  • 前面同时添加i , ignore 忽略

    • iexact
    • icontains
    • istartswith
    • iendswith
  • django中查询条件有时区问题

    • 关闭django中自定义的时区

      • setting.py

      • USE_TZ = False
        
    • 在数据库中创建对应的时区表

 

F方法

  • 可以获取我们属性的值

    companies = Company.objects.filter(c_boy_num__lt=F('c_gril_num')-15)
    

     

  • 可以实现一个模型的不同属性的运算操作

  • 还可以支持算术运算

 

Q方法

  • 可以对条件进行封装
    companies = Company.objects.filter(Q(c_boy_num__gt=5) | Q(c_gril_num__gt=10))
    
  • 封装之后,可以支持逻辑运算
    • 与 & and
    • 或 | or
    • 非 ~ not

模型成员

  • 显性属性
    • 开发者手动书写的属性
  • 隐性属性
    • 开发者没有书写,ORM自动生成的

    • 如果你把隐性属性手动声明了,系统就不会为你产生隐性属性了

      class AnimalManager(models.Manager):
          '''继承一下models.Manager,对其进行扩散'''
      
          '''
          重写get_queryset方法,为他添加一个自定义的筛选条件
          '''
          def get_queryset(self):
              return super(AnimalManager, self).get_queryset().filter(is_delete=False)
          '''
          自定义一个create_animal方法,用来实现缺省值创建
          '''
          def create_animal(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.BooleanField(default=False)
          '''
          将隐性属性手动声明,将它命名为’object‘,然后自己重写’object‘--->AnimalManager()
          '''
          objects = AnimalManager()
      

       

作业

  • 做一个班级学生列表

    • 班级列表
    • 班级列表可点击
    • 点击的时候显示班级所有学生

定义属性

概述
  • django根据属性的类型确定以下信息

    • 当前选择的数据库支持字段的类型
    • 渲染管理表单时使用的默认html控件
    • 在管理站点最低限度的验证
    • django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
属性命名限制
  • 遵循标识符规则
  • 由于django的查询方式,不允许使用连续的下划线
  • 定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入到django.db.models中
使用方式
  • 导入from django.db import models
  • 通过models.Field创建字段类型的对象,赋值给属性
逻辑删除
  • 对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False
字段类型
  • AutoField:一个根据实际ID自动增长的IntegerField,通常不指定如果不指定,一个主键字段将自动添加到模型中

  • CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput

  • TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea

  • IntegerField:整数

  • DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数

    • 参数说明

      • DecimalField.max_digits:位数总数
      • DecimalField.decimal_places:小数点后的数字位数
    • FloatField:用Python的float实例来表示的浮点数

    • BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput

    • NullBooleanField:支持null、true、false三种值

    • DateField([auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期

      • 参数说明

        • DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
        • DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
    • 说明:

      • 该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
    • 注意

      • auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果
    • TimeField:使用Python的datetime.time实例表示的时间,参数同DateField

    • DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField

    • FileField:一个上传文件的字段

    • ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image

字段选项
  • 概述

    • 通过字段选项,可以实现对字段的约束
    • 在字段对象时通过关键字参数指定
    • null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
  • blank:如果为True,则该字段允许为空白,默认值是 False

    • 注意:

    • null是数据库范畴的概念,blank是表单验证证范畴的

    • null和blank的区别:null== ,blank==""

      s_grade = models.ForeignKey(Grade)
      s_grade.null
      s_grade.blank
      
  • db_column:字段的名称,如果未指定,则使用属性的名称

  • img

  • default:默认值

  • primary_key:若为 True, 则该字段会成为模型的主键字段

  • unique:如果为 True, 这个字段在表中必须有唯一值

关系
  • 分类

    • ForeignKey:一对多,将字段定义在多的端中
    • ManyToManyField:多对多,将字段定义在两端中
    • OneToOneField:一对一,将字段定义在任意一端中
  • 用一访问多

    • 格式:对象.模型类小写_set
    • 示例:grade.students_set
  • 用一访问一

    • 格式:对象.模型类小写
    • 示例:grade.students
  • 访问id

    • 格式:对象.属性_id
    • 示例:student.sgrade_id
posted @ 2020-01-31 14:02  东坡肉肉君  阅读(128)  评论(0编辑  收藏  举报