Model
MTV
- M:model,模型,和mvc中的M功能相同,和数据库进行交互。
- V:view ,视图,和MVC中的c功能相同,接受请求,进行处理,与M和T进行交互,返回应答。
- T:Template,模板,和mvc中的v相似,产生html界面
- 1、用户点击注册按钮,将要注册的内容发送给网站的服务器。
- 2、view视图接收到用户发来的注册数据,View告诉Model将用户的注册信息保存进数据库。
- 3、Model层将用户的信息保存到数据库中。
- 4、数据库将保存的结果返回给Model
- 5、Mode将保存的结果给View视图。
- 6、view视图告诉Template模板去产生一个html界面。
- 7、Templage生成html内容返回给view视图
- 8、view视图将html界面内容返回给浏览器
- 9、浏览器拿到view返回的html页面内容进行解析,展示。
开发流程
- 1 配置数据库
- 2 定义模型类(一个类对应一张表)
- 3 生成迁移文件
- 4 执行迁移生成数据表
- 5 使用模型类进行增删改查(CRUD)
ORM
-
对象关系映射
-
可以理解为翻译机
-
核心思想是解耦合
- 将业务逻辑和SQL进行解耦合
-
新增 save()
-
更改 save()
-
删除 delete()
-
逻辑删除
-
id能生成自增id
-
字段类型
- CharField:字符串,表单控件对应TextInput;
- TextField:大文本字段,长度超过4000时,对应TextArea;
- IntegerField:整数;
- DecimalField:十进制浮点数,精度更改,不会因为小数产生误差;
- FloatField:浮点书;
- BooleanField:布尔值;
- NullBooleanField:Null、True、False;
- DateField:日期;
- FileField:文件上传字段;
- ImageField:只存图片文件;
-
字段选项
- null
- blank
- db_table 表名(可自定义)
- db_column,字段名称
- db_index,若值为True,则会添加索引
- default
- primary_key 主键
- unique 唯一值
- ordering 在查询数据时的排列规则
- max_length
-
关系
- ForeignKey:一对多,将字段定义在多的端中
-
过滤器(查)
- filter:返回复合帅选条件的数据集
- exclude:返回不符合筛选条件的数据集
- 多个filter和exclude可以连接起来使用
- 链式调用
- Person.object.filter().filter().exclude()
- 多个filter和exclude可以连接起来使用
- order_by: 排序
- values:将数据转为字典,并返回列表
- all:获取所有
- get:获取一个值
- 没有获取时会抛异常
- 当查询条件存在多个对象,会报错
- first:获取查询集中的第一个值
- last:获取查询集中的最后一个值
- last和first可能会获取同一个数据,需要先手动排序
- count:获取查询集中的数量
- exists:判断查询集中是否有值,有则返回True
方法
- 对象方法
- 可以调用对象的属性,也可以调用类的属性
- 类方法
- 不能调用对象属性,只能调用类属性
- 静态方法
- 什么都不能调用
- 寄生在别的类上
状态码
- 2xx
- 请求成功
- 3xx
- 重定向
- 4xx
- 客户端错误
- 5xx
- 服务端错误
- 后端开发应避免
查询切片
- QuerySet[5:15],获取第5到第15条数据;
- 在查询数据库的时候就直接进行切片;
- 相当于sql中的limit和offset;
- 如users = User.objects.all()[2: 5];
- 下标不能是负数;
缓存集
- filter
- exclude
- all
- 以上操作都不真正地查询数据库;
- 只有在迭代结果集,或者获取单个对象属性时才会查询数据库;
- 懒查询;
查询条件
-
属性__运算符=值;
-
以下均为运算符:
- gt 大于
- lt 小于
- gte
- lte
- in 在某一集合中
- contains 类似于模糊查询,类似like
- startswith 以xx开始,类似like
- endswidth 以xx结束,类似like
- isnull 为空;
- isnotnull 不为空;
- 前面均可添加i,即忽略:
- icontains
- istartswidth
- iexact 不等于
-
year、month、day、week_day、hour、minute、second
- filter(lasttime__year=2017);
- 存在时区问题;
- 关闭django自定义的时区;
- setting中:USE_TZ改为False
- 在数据库中创建对应的时区表;
- 关闭django自定义的时区;
跨关系查询
- 从元素查表;
- 根据级联查到的数据;
- 直接根据学生信息查班级;
- grades = Grade.objects.filter(student__s_name=‘1’);
聚合函数
- Avg
- Count
- Max
- Min
- Sum
- 如Student.objects().aggregate(Max(‘sage’))
- 获取Student表中sage字段最大值;
- 返回的结果:{‘sage__max’: 9};
F对象
- 可以获取属性的值;
- 可以实现一个模型的不同属性的运算操作;
- 可以使用模型的A属性与B属性进行比较
- 如查找一个男生数量少与女生的公司;
- companies = Company.objects.filter(c_boy_num__lt=F(‘c_girl_num’));
- companies = Company.objects.filter(c_boy_num__lt=F(‘c_girl_num’)-15);
- 女生数减男生数大于15的公司;
- 支持算术运算;
Q对象
- 对查询条件进行封装;
- 封装后支持逻辑运算(与或非);
- 如男生数大于1,女生数大于20的查询条件;
- companies = Company.objects.filter(Q(c_boy_num__gt=1) & Q(c_girl_num__gt=20))
模型成员
- 显性属性
- 开发者手动书写的属性
- 隐性属性
- 开发者没有书写,orm自动生成的属性;
- 隐性属性被手动声明,系统就不会产生了,变成显性的了;