Django_Day2
Day02
Model
- 在企业开发中,我们通常都是从数据开始开发的
ORM
-
对象关系映射
-
可以理解为翻译机
-
核心思想,解耦合
- 将业务逻辑和SQL进行了解耦
数据库中数据类型
- 字符串
- 数字
- 日期时间
模型过滤
-
filter
-
exclude
-
连续使用
- 链式调用
- Person.objects.filter().filter().xxxx.eclude().exclude().yyyy
快捷键
- .re 快捷生成return
- . if 多用点看看世界的美好
方法
-
对象方法
- 可以调用对象的属性,也可以调用类的属性
-
类方法
-
不能调用对象属性,只能调用类属性
-
加了类方法后不用重新迁移
- 为数据表添加默认值,就可以进行动态修改,不然直接生成的带缺省值的一条记录是无法修改的
-
-
静态方法
- 啥都不能调用,不能获取对象属性,也不能获取类属性
- 只是寄生在我们这个类上而已
状态码
-
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:字段的名称,如果未指定,则使用属性的名称
-
default:默认值
-
primary_key:若为 True, 则该字段会成为模型的主键字段
-
unique:如果为 True, 这个字段在表中必须有唯一值
关系
-
分类
- ForeignKey:一对多,将字段定义在多的端中
- ManyToManyField:多对多,将字段定义在两端中
- OneToOneField:一对一,将字段定义在任意一端中
-
用一访问多
- 格式:对象.模型类小写_set
- 示例:grade.students_set
-
用一访问一
- 格式:对象.模型类小写
- 示例:grade.students
-
访问id
- 格式:对象.属性_id
- 示例:student.sgrade_id