Django+Drf+drf-yasg 学习笔记
References:
Django drf 教程
Django 项目启动:
# 创建环境
python -m venv venv
# 安装依赖
pip install -r requirement.txt
# 检测模型文件修改(初次启动的时候可以直接 migrate)
python manage.py makemigrations app_name
# 创建新定义的模型的数据表
python manage.py migrate
# 收集静态文件至 STATIC_ROOT 中
python manage.py collectstatic --noinput
# 启动服务
python manage.py runserver
模型层(models)
作用: 构建和操纵 web 应用的数据
特点:由于 Django 的 orm 即对象关系映射模式,每一个模型映射一张数据库表
-
每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
-
模型类的每个属性都相当于一个数据库的字段
-
Q:
model_name.objects.get()
和model_name.objects.filter()
有什么区别- A: get 可以理解为精准匹配,通常返回值是一个定义的model对象,只有一条记录返回的时候才正常,也就说明get的查询字段必须是主键或者唯一约束的字段。当返回多条记录或者是没有找到记录的时候都会抛出异常。
- filter返回 QuerySet 对象列表,有没有匹配的记录都可以。
字段关联关系
TODO
drf serializers
serializers 主要是对 Model 对象的操作,包括序列化(将 Python 数据类型转换为 json)和反序列化
- 继承于 serializers.ModelSerializer
- ModelSerializer 的父类是Serializer,是 在Serializer的基础上的扩展
- 可以直接通过 Class Meta 里配置 fields 来对 model 进行序列化,简化了 Serializer 的操作
- Meta里可以配置如下配置:
- model:指定需要序列化的model
- depth:序列化时,读取数据的深度,默认是0,0表示仅展示该model对象的值,1表示为展示与该model对象直接外键关联的对象的相关数据,以此类推
- fields:需要序列化的字段,是一个元组,“all”,表示所有字段
- exclude:不需要序列化的字段,默认是在全字段的情况下剔除不需要序列化的字段,
- 注意:fields和exclude不能同时使用
- extra_kwargs:给fields中的字段,添加额外的属性,如只读(read_only)、只写(write_only)等
- read_only_fields:只读字段
- validators:
在显示指定序列化字段时,可以通过source='xxx’来指定需要关联的外键对象的值,通过点分式获取对应的字段。
drf-yasg swagger_serializer_method
可以用这个装饰器来装饰一个序列化字段标识它从哪里取值,通常用于一些外键或者嵌套字段的取值。
视图层(views)- 相当于 controller 层,负责处理用户的请求并返回响应
视图有基于函数的视图,有基于类的视图,一般使用 drf 之后,我们会继承 ModelViewSet 来创建基于类的视图:
- 继承自各个 mixin 类和 GenericViewSet,所以默认就提供了增删查改相关方法,具体在代码中点击进入看就会发现
路由
关于 URL:
- Django 规定每一个模式要求 URL 以一个斜线结尾
- urlpatterns 都可以 include 其他 URLconf 模块,即将一部分 URL 放置于其他 URL 下面
- URL 模式可以使用正则表达式,使用 re_path() 而不是 path()
而对于 drf:常用路由是 DefaultRouter
- drf 添加了对自动 URL 路由到 Django 的支持,提供了一种简单、快速和一致的方式将试图逻辑连接到一组 URL
- 常用的是 DefaultRouter,默认会不全常见的 CRUD 接口
- 自动基于 viewSet 生成 xxx-list 以及 xxx-detail,自定义的接口,默认将 “_” 替换成 “-”
管理
- step1: 从 根 URLConf 中创建 admin 路由
- step2: python manage.py createsuperuser 创建管理员账号
- step3: 继承 ModelAdmin 用来处理自定义界面
- 其他处理主题的方式可以参考 https://docs.djangoproject.com/zh-hans/3.2/ref/contrib/admin/#hooking-adminsite-to-urlconf
管理静态文件
- 配置静态文件,定义 STATIC_URL STATIC_ROOT
- 配置 whiternoise 提供静态文件服务(可以不依赖像 nginx 这样的 external service)
- python manage.py collectstatic