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类

       

 

 

 

 

 

 

 

 

 

              

 

posted @   哩子吖  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示