02.django升级打怪学习记
定义属性
·django根据属性的类型确定以下信息
·当前选择的数据库支持字段的类型
·渲染管理表单时使用的默认html控件
·在管理站点最低限度的验证
django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
· 属性命名限制
·遵循标识符规则
·由于django的查询方式,不允许使用连续的下划线
库:导入from django.db import models
逻辑删除
对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False
字段类型
·AutoField |
·一个根据实际ID自动增长的IntegerField,通常不指定如果不指定,一个主键字段将自动添加到模型中 |
CharField(max_length=字符长度) |
·字符串,默认的表单样式是 TextInput |
TextField |
·大文本字段,一般超过4000使用,默认的表单控件是Textarea |
IntegerField |
·整数 |
DecimalField(max_digits=None, decimal_places=None) |
·使用python的Decimal实例表示的十进制浮点数 |
FloatField |
·用Python的float实例来表示的浮点数 |
·BooleanField |
·true/false 字段,此字段的默认表单控制是CheckboxInput |
·NullBooleanField |
·支持null、true、false三种值 |
·DateField([auto_now=False, auto_now_add=False]) |
·使用Python的datetime.date实例表示的日期 |
TimeField |
·使用Python的datetime.time实例表示的时间,参数同DateField |
DateTimeField |
使用Python的datetime.datetime实例表示的日期和时间,参数同DateField |
FileField |
一个上传文件的字段 |
ImageField |
继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image |
字段选项
通过字段选项,可以实现对字段的约束
在字段对象时通过关键字参数指定
null |
·如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False,数据库范畴的概念 |
blank |
·如果为True,则该字段允许为空白,默认值是 False,表单验证范畴 |
db_column |
·字段的名称,如果未指定,则使用属性的名称 |
db_index |
若值为 True, 则在表中会为此字段创建索引 |
default |
默认值 |
primary_key |
若为 True, 则该字段会成为模型的主键字段 |
unique |
如果为 True, 这个字段在表中必须有唯一值 |
关系
字段选项 |
概念 |
示例 |
ForeignKey |
一对多,将字段定义在多的端中 |
grade.students_set |
Many ToManyField |
多对多,将字段定义在两端中 |
student.sgrade_id |
OneToOneField |
一对一,将字段定义在任意一端中 |
grade.students |
模型成员objects
fiter:返回符合帅选条件的数据集
exclude:返回不符合帅选条件的数据集
示例:
查询集和过滤器
在管理器上调用方法返回查询集,支持链式:
all:返回所有数据
filter:返回符合条件的数据
exclude:过滤掉符合条件的数据
order_by:排序
values:一条数据就是一个字典,返回一个列表
get:返回一个满足条件对象
first:查询集中的第一个对象
last:返回查询集中的最后一个对象
count:返回当前查询集中的对象个数
exists:判断查询集中是否有数据,如果有数据返回True没有反之
限制查询集合查询集的缓存
字段查询:
*属性__运算符=值
*gt/lt/gte/lte/in/contains
*startswith 以xx开始,本质也是like
*endswith以xx结束
*exact精确
*前面同时添加i,ignore忽略(iexact / icontains /istartswith / iendswith
比较运算符:
跨关系查询:模型类名_属性名_比较运算符,实际上就是处理数据库中的join
模型成员
*类属性
显性:开发者手动书写的属性
隐性:ORM自动生成的;如果你把隐形属性手动声明,系统不会为你产生隐性属性
备注:
*对象方法:可以调用对象的属性,也可以调用类的属性
*类方法:不能调用对象属性,只能调用类属性
*静态方法:什么都不能调用,不能获取对象属性,爷不能获取类属性,只能在自身
状态码:
*2xx:请求成功
*3xx:转发或重定向
*4xx:客户端错误
*5xx:服务器错了/后端开发人员最不想看到
F类用途
*可以获取我们属性的值
*可以实现一个模型的不同属性的运算操作
*还可以支持算术运算
Q类用途:
*可以对条件进行封装
*封装之后,可以支持逻辑运算(与&或|非~)