·django开发之规范和细节
- 编码规范
- 项目准备
- model层字段介绍
编码规范
1 | Beautiful is better than ugly. |
- 适当的缩进
- 优选空格
- 适当的长度
项目准备
构建虚拟环境
在某盘某个目录下执行命令:
1 | python -m venv typeidea-env |
激活环境
1 | D:\Envs\typeidea-env>cd Scripts |
构建项目
1 | (typeidea-env) D:\Envs\typeidea-env\Scripts>cd .. |
1 | ##启动项目 报错参考https://www.pianshen.com/article/82141167778/ |
拆分setting适应不同的环境
构建settings文件夹.目录结构如下
注意:base.py基于外部的settings.py文件
新增develop配置文件如上图所示,最后修改manage.py和wsgi.py识别新的配置文件
1 | ## os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djwwj.settings") |
并且设置一个环境变量 TYPEIDEA_PROFILE = develop
vscode设置django参考
编写model层代码
在django中有一个app应用的概念。每个app应该是一个自组织的应用。可以根据model的业务性质分别进行处理
根据上面的规划:model可以划分blog相关,配置相关,评论相关
构建blog App
执行命令
1 | (typeidea-env) D:\Envs\typeidea-env\typeidea\djwwj>manage.py startapp blog |
blog相关的model分类大概有种类,标签以及帖子,构建的model如下
1 | from django.db import models |
注意:上面总体构建的步骤就是规划模型—–>设计模型——>构建模型
构建config App
同理我们构建配置选项,model里面主要是连接和侧边栏
1 | from django.db import models |
构建comment App
在这里暂时将评论和文章耦合起来。当然以后可以独立出来
1 | from django.db import models |
到此3个model类型构建完毕。还有值得修改的地方
一系列流程
在installedapps添加 文件在bast.py
1 | INSTALLED_APPS = [ |
在djwwj目录下执行数据库迁移的操作
1 | manage.py makemigrations |
model层说明
常用的字段类型
数值型
1.AutoField 自增主键,可以被重写
2.BooleanField 布尔类型字段,一般记录状态标记
3.DecimalField decima 数据精度比较高的字段。注意需要在python中使用Decimal类型进行转换
4.IntegerField 整数字段,不自增
5.PostiveIntegerField 只包含正整数
6.SmallIntegerField smallint 小整数
字符型
1.CharField 基础的varchar类型
2.UrlField 对url的特殊处理
3.UUIDField 存放唯一id
4.EmailField 对email的处理
5.FileField 对文件的特殊处理,在admin展示可以自动生成一个上传文件的按钮
6.TextField 存放正文类容
7.ImageField 处理图片相关的数据
日期类型
分别为DateField 和 DateTimeField 以及 TimeField 就不在细说了
关系类型
ForeignKey 多对一 OneToOneField 一对一 以及 ManyToManyField 多对多
1 | # 可以参考文章https://www.cnblogs.com/navysummer/p/10200154.html |
字段参数类型
1.null 空类型
2.blank 不能为空
3.choices可选项
4.db_column对应数据库字段类型
5.db_index 索引配置
6.default 默认配置
7.editable 是否可编辑
8.error_messages 检查异常是提示
9.help_text 字段提示语
10.primary_key 主键设置
11.unique 唯一约束
12.unique_for_data/month/year 可以针对日期,月和年的约束
13.verbose_name 字段展示相应的文案
14.validators 自定义逻辑校验
QuerySet的使用
QuerySet的主要作用是数据库的所有查询以及有更新的交互都是需要这个来完成的
在model层中django提供了一个objects属性来提供数据操作的接口。并且支持链式操作,同时queryset是懒加载的
常用的接口
支持链式调用
1.all接口等于查询所有
2.filter接口根据条件过滤数据
3.exclude根据条件排除之外,和filter相反
4.reverse接口 结果倒序
5.distinct 去重查询
6.none接口 返回空
不支持链式调用
1.get接口根据条件进行查询
2.create接口创建一个model对象
3.get_or_create根据条件进行查找,没有就创建
4.update_or_create 根据条件更新没有就创建
5.lastest接口返回最新的记录
6.earliest接口获取第一个记录
7.last接口获取最后一条
8.exists 返回布尔值.判断是否存在
9.bulk_create接口 批量创建记录
10.in_bluk 批量查询
11.update接口 批量更新
12.delete接口 批量删除
13.values接口 明确只需要某个返回字段值,不需要实例时
14 values_list接口 返回的是元组的queryset
进阶接口
defer 不需要的字段做延迟加载,但是在循环查询中会产生N+1,重复查询的问题
only接口 与defer相反
select_related 关联查询 针对一对多 也可以解决N+1的问题
prefetch_related 关联查询 针对多对多的
常用的字段查询
针对QuerySet
方法 filter()
、exclude()
和 get()
的关键字参数。
contains 包含相似查询
icontains 同上,忽略大小写
exact 精确匹配
in 指定某个集合
gt 大于 gte 大于等于
lt 小于 lte 小于等于
startswith endwith 以什么开始,什么结尾
range 用于时间范围查找
进阶查询
F 用来保证数据避免出现竞争状态 保证数据的原子性
Q 执行and 或者 or 的复杂表达式
聚合运算可以参考文档也可以 使用annotate()
执行更简便的操作
执行原生sql
可以通过raw接口来执行