Django REST framework
简介
在 Django 框架基础之上,进行二次开发
用于构建 Restful API
简称为 DRF 框架 或 REST framework
特性
提供了强大的 Serialize 序列化器,可以高效进行序列化与反序列化操作
提供了极为丰富的类视图、Mixin 扩张类、ViewSet 视图集
提供了直观的 Web API 界面
多种身份认证喝权限认证
强大的排序、过滤、分页、搜索、限流等功能
可扩展性,插件丰富
安装与配置
pip install djangorestframework
pip install markdown
在setting.py 配置
INSTALLED_APPS = [
' rest_framework ',
]
在子应用中创建一个 serialize 序列化器
1、继承 Serializer 类或者子类
2、定义的序列化器字段,默认既可以进行序列化输出,也可以进行序列化输入
3、需要在前端输出哪些数据则在序列化器中定义类属性
4、若设置 read_only = True ,指定该字段只能进行序列化输出
5、若设置 write_only = True,则指定该字段只能进行反序列化输入,但不进行序列化输出
6、在序列化器字段定义时,通过 validators 字段选项添加校验器,校验器可以使用restframework 自带的,或者自定义校验器
a、字段校验器的校验顺序:字段定义时的限制(包含validator 列表条目从左到右进行校验)--> 单字段的校验(validate_字段名)--> 多字段联合校验(validate)
b、在序列化器中自定义单字段检验器,命名规则:validate_字段名
c、在序列化器中自定义多字段检验器,命名规则:validate,参数:attrs
7、不在视图对数据库进行增删改查操作,在序列化器中操作定义,
如:在view.py 文件中,如果在创建序列化器对象时,只给data传参,那么调用 serializer.save()实际就是调用序列化对象的 create()
8、保存或更新数据库模型
校验器的调用
单字端校验器
多字段校验器
在序列化器中进行数据库操作
自定义检验器
简化序列化器类的定义,直接继承模型序列器
功能:
基于模型类自动生成一系列字段
基于模型类自动为 Serializer 生成 validators ,比如unique_together
包含默认的 create() 和update()的实现
步骤:
1、在元类中,指定参考哪一个模型类来创建
2、在元类中,指定为模型类的哪些字段,来生成序列化器,field 字段为指定需要哪些模型字段,exclude 字段为指定模型中的哪些字段不需要
3、在元类中,read_only_fields 指定某些模型字段为只输出
4、在元类中,针对某个字段的添加或者修改或包含一些错误信息提示,则需要 extra_kwargs
5、若需要指定某个字段需要检验器,则在元类之前定义
6、在view.py 文件中继承 APIView
7、关联外键序列化器
a、数据库模型中的外键字段,默认会生成 PrimaryKeyRelatedField 序列化器,序列化输出的值为外键 ID 值
b、StringRelatedField ,此字段将被序列化为关联对象字符串表达形式(__str__() 返回值)
project = serializers.StringRelateField(label= ’所属项目‘)
c、SlugRelateField,此字段将被序列化为关联对象的指定字段数据
project = serializers.SlugRelatedField( slug_field = 'tester',read_only= True )
d、使用关联对象的序列化器
project = ProjectModelSerializer ( label='所属项目' ,read_only= True)
extra_kwargs 字段
在子应用的view 文件中调用序化器
1、通过模型类对象(或者查询集),传给instance参数即可进行序列化操作
2、通过传递 序列化器对象的data属性参数,即可以获取转化之后的字典。总结:传参data 是反序列化,instance 是序列化
3、反序列化器中,检验前端输入的数据,调用序列化器对象的 is_valid ()来检验前端参数
如果检验成功,则返回True,否则校验失败返回False
设置 is_valid() 参数 raise_exception = True ,那么检验失败之后会抛出异常
当调用 is_valid () 后,才可以调用 errors 属性,获取检验失败的错误提示
当校验成功之后的数据,可以使用 validated_data 属性来获取
在创建序列化器对象时,同时给 instance 和 data 传参,那么调用save()会自动调用序列化器对象的update()
序列化器的save()调用
分页器
自定义一个分页器,然后在setting.py 文件中注册说明
类视图
APIView(需要自定义get/put/delete 等请求方法)
继承Django 中 的View
APIView 与View 的不同之处
~~:传入到视图方法中的是Request 对象,而不是Django 的 HttpRequest 对象
~~:视图方法可以返回 Response 对象,会为响应数据处理(render)为符合前端要求的格式
~~:任何 APIException 异常都会被捕获到,并且处理成合适的响应信息
~~:在进行 dispatch() 分发前,会对请求进行身份认证、权限检查、流量控制
常用类属性
authentication_classes 列表或元组,身份认证类
permission_classes 列表或元组,权限检查类
throttle_classes 列表或元组,流量控制类
GnenricAPIView
继承APIView
支持的类属性
必须指定的类属性
queryset
serializer_class
过滤
filter_backends:声明过滤引擎
filter_fields:声明过滤字段列表
使用开源的过滤引擎:pip install -i https://pypi.douban.com/simple django-filter
导入:from dhango_filters.rest_framework import DjangoFilter
两种方式指定过滤引擎
a、针对某个视图指定过滤引擎
filter_backends = [ DjangoFilterBackend ]
filter_fields = [ 'name', 'leader', 'tetst ' ] # 指定过滤字段
b、在setting.py 文件中全局指定过滤引擎,针对所有视图有效
INSTALLED_APPS = [ ' django_filters ', ]
REST_FRAMEWORK = { [ 'DEFAULT_FILTER_BACKENDS': ' django_filters.reset_framework.DjangoFilterBackend ' ],}
filter_backends:声明过滤、排序引擎,
ordering_fields:声明排序字段列表
导入:from rest_framework import filters
两种方式指定排序
a、针对某个视图指定排序
filter_backends = [ filters.OrderingFilter ]
ordering_fields = [ ’name‘, ’leader ‘, 'test' ]
b、在setting.py 文件中全局指定排序引擎,针对所有视图有效
REST_FRAMEWORK = { [ 'DEFAULT_FILTER_BACKENDS': ' django_filters.reset_framework.DjangoFilterBackend ' ],
[ django_filters.rest_framework.backends.DjangoFilterBackend ], }
分页:pagination_class
两种方式声明
a、在全局setting.py 文件中指定分页引擎
REST_FRAMEWORK = { ' DEFAULT_PAGINATION_CLASS ':'rest_framework.pagination.PageNumberPagination',
' PAGE_SIZE ':3, }
b、详情页视图声明
lookup_field 查询详情数据时使用的字段名。默认为 pk
lookup_url_kwargs 查询详情数据时 URL 路径参数名称,默认与lookup_field 相同
支持的类方法
get_queryset(self):返回视图使用的查询集对象
get_objects(self):返回详情视图所需的模型类对象
~~:返回详情视图所需的模型类对象
~~:默认使用 lookup_field(pk) 参数来过滤
~~:如果访问的模型类对象不存在,会返回404
get_serializer(self, *args, **kwargs ):返回序列化器对象
get_serializer_class(self):返回序列化器类,默认返回 serializer_class,可用于重写序列化器输出
Mixins
RetrieveModelMixin
提供 retrieve(request, *args, **kwargs)方法
获取已存在的详情数据(一条记录)
获取成功,则返回 200 OK
如果不存在,则返回 404 Not Found
UpdateModelMixin
提供update(request, *args, **kwargs)方法,用于全部更新
提供 partial_update( request,*args, **kwargs ) 方法,用于部分更新,支持 PATCH 方法
更新已存在的模型实例(更新一条记录)
更新成功,则返回 200 OK
如果请求参数有误,则返回 400 Bad Request
如果不存在,则返回 404 Not Found
DestoryModelMixin
提供 destroy (request, *args, **kwargs) 方法
删除一条已存在的数据
删除成功,则返回 204 No Content
如果不存在,则返回 404 Not Found
ListModelMixin
提供 list ( request, *args, **kwargs ) 方法
获取已存在的列表数据(获取多条记录)
获取成功,则返回 200 ok
CreateModelMixin
提供 create(request,*args, **kwargs)方法
创建新的模型实例
创建成功,则返回 201 Created
如果请求参数有误,则返回 400 Bad Request
Concrete Generic Views
RetrieveAPIView
提供 get 方法
继承:RetrieveModelMixin、GenericAPIView
UpdateAPIView
提供 put 和 patch 方法
继承:UpdateModelMixin、GenericAPIView
DestroyAPIView
提供 delete 方法
继承:DestroyModelMixin、GenericAPIView
ListAPIView
提供 get 方法
继承:ListModelMixin、GenericAPIView
CreateAPIView
提供 post 方法
继承:CreateModelMixin、GenericAPIView
ListCreateAPIView
提供 get、post 方法
继承:ListModelMixin、CreateModelMixin、GenericAPIView
RetrieveUpdateAPIView
提供 get、put、patch 方法
继承:RetrieveModelMixin、DestroyModelMixin、GenericAPIView
RetrieveDestroyAPIView
提供 get、delete 方法
继承:RetrieveModelMixin、DestroyModelMixin、GenericAPIView
RetrieveUpdateAPIView
提供 get、put、patch、delete
继承:RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin、GenericAPIView
以上类的缺点基本是不能合并两个类视图,有相同的get方法等,不同的视图对应的 URL 地址不一样
ViewSet(视图集)
用动作映射请求方法的不同动作,以此解决不能合并类视图的缺点
ViewSet 不再支持 get、post、put、delete等请求方法,而只支持action 动作,但不提供get_object()、get_serialize() 等方法,所以继承GenericViewSet类
继承 ViewSetMixin 和 views.APIView所有继承
ViewSetMixin 支持 action 动作
未提供 get_object()、get_serializer()、quertset、serializer_class 等
GenericViewSet类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!