• 10_18视图家族与序列化的传参。


    一。序列化传参

      在视图类中实例化序列对象时,还有一个参数为context,这个参数是存放字典,将所有从前端传来的数据传输到序列化中,比如需要在序列化中校验当前用户。

      传入的request参数也是一个对象。

      视图层:

    class Book(APIView):
        def post(self, request, *args, **kwargs):
            book_ser = serializers.BookModelSerializer(data=request_data,context={'request':request})
            book_ser.is_valid(raise_exception=True)
            book_result = book_ser.save()
            return Response({
                'status': 0,
                'msg': 'ok',
                'results': serializers.BookModelSerializer(book_result).data
            })
    View Code

      序列化层

    class BookModelSerializer(ModelSerializer):
        class Meta:
            model = models.Book
            fields = ('name', 'price')
        def validate_name(self, value):
            print(self.context.get('request').method)
            return value
    View Code

    二。二次封装responser类

      在这个类中可以继承自该类,接受其他参数,调用父类进行传参,从而定义自己喜欢的返回数据。

    from rest_framework.response import Response
    
    class APIResponse(Response):
        def __init__(self, data_status=0, data_msg='ok', results=None, http_status=None, headers=None, exception=False, **kwargs):
            # data的初始状态:状态码与状态信息
            data = {
                'status': data_status,
                'msg': data_msg,
            }
            # data的响应数据体
            # results可能是False、0等数据,这些数据某些情况下也会作为合法数据返回
            if results is not None:
                data['results'] = results
            # data响应的其他内容
            # if kwargs is not None:
            #     for k, v in kwargs.items():
            #         setattr(data, k, v)
            data.update(kwargs)
    
            super().__init__(data=data, status=http_status, headers=headers, exception=exception)
    View Code

    三。视图家族。

      视图家族中包括

        views       视图

        generics      工具视图

        mixins     视图工具集

        viewsets  视图集

      首先是apiview(as_view,display,类属性)

      然后是GenericAPIView 封装序列化组件。

      mixins五大工具类6工具。

      generics中的工具视图,也就是工具加上视图。

      最后是viewsets的视图集

    四。GenericAPIView基类。

      这个基类是继承自APIView的,完全兼容APIView。其中具体封装了可以下类:

    # 1)get_queryset():从类属性queryset中获得model的queryset数据
    # 2)get_object():从类属性queryset中获得model的queryset数据,
                再通过有名分组pk确定唯一操作对象
    # 3)get_serializer():从类属性serializer_class中获得serializer的序列化类

      具体用法:

    from rest_framework.generics import GenericAPIView
    class BookGenericAPIView(GenericAPIView):
        queryset = models.Book.objects.filter(is_delete=False)
        serializer_class = serializers.BookModelSerializer
        # 自定义主键的 有名分组 名
        lookup_field = 'pk'
        # 群取
        # def get(self, request, *args, **kwargs):
        #     book_query = self.get_queryset()
        #     book_ser = self.get_serializer(book_query, many=True)
        #     book_data = book_ser.data
        #     return APIResponse(results=book_data)
    
        # 单取
        def get(self, request, *args, **kwargs):
            book_query = self.get_object()
            book_ser = self.get_serializer(book_query)
            book_data = book_ser.data
            return APIResponse(results=book_data)

      主要是需要提供类属性queryser和serializer_class,获取模板 信息和序列化对象,

      也可以通过lookup_field改变获取的pk属性名。

    五。mixins视图工具集,

      这是一个工具集,想那些单查,单改等操作都封装起来,到那时前提要继承GenericAPIView。

      一共封装了五个工具类,六个方法:单查、群查、单增、单删、单整体改、单局部改。其中updateModelMixin封装了单整改和单局部改

      所有的视图类都要继承GenericAPIView类,因为要提供那些方法。

      工具类的工具方法返回值都是Response类型对象,如果要格式化数据格式再返回给前台,可以通过 response.data 拿到工具方法返回的Response类型对象的响应数据。

    from rest_framework.mixins import ListModelMixin, 
    CreateModelMixin, RetrieveModelMixin, UpdateModelMixin
    class BookMixinGenericAPIView(ListModelMixin,
    CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, GenericAPIView): queryset
    = models.Book.objects.filter(is_delete=False) serializer_class = serializers.BookModelSerializer def get(self, request, *args, **kwargs): if 'pk' in kwargs: response = self.retrieve(request, *args, **kwargs) else: # mixins提供的list方法的响应对象是Response,
            想将该对象格式化为APIResponse
    response = self.list(request, *args, **kwargs) # response的数据都存放在response.data中 return APIResponse(results=response.data) def post(self, request, *args, **kwargs): response = self.create(request, *args, **kwargs) return APIResponse(results=response.data) def put(self, request, *args, **kwargs): response = self.update(request, *args, **kwargs) return APIResponse(results=response.data) def patch(self, request, *args, **kwargs): response = self.partial_update(request, *args, **kwargs) return APIResponse(results=response.data)

    六。工具视图。

      工具视图都是GenericAPIView的子类,且不同的子类继承了不听的工具类,重写了请求方法。

      工具视图的功能如果直接可以满足需求,只需要继承工具视图,提供queryset与serializer_class即可。

    urlpatterns = [
           url(r'^v4/books/$', views.BookListCreatePIView.as_view()),
        url(r'^v4/books/(?P<pk>.*)/$', views.BookListCreatePIView.as_view()),
    ]
    
    from rest_framework.generics import ListCreateAPIView, UpdateAPIView
    class BookListCreatePIView(ListCreateAPIView, UpdateAPIView):
        queryset = models.Book.objects.filter(is_delete=False)
        serializer_class = serializers.BookModelSerializer
  • 相关阅读:
    学习Python的一些Tips
    读书笔记《深入理解计算机系统》(第三版) 第二章 信息的表示
    读书笔记《深入理解计算机系统》(第三版) 第一章 计算机系统漫游
    C 标准库系列之locale.h
    C 标准库系列之limits.h
    C 标准库系列之float.h
    C 标准库系列之errno.h
    C 标准库系列之ctype.h
    C 标准库系列之assert.h
    C 标准库系列之概述
  • 原文地址:https://www.cnblogs.com/LZXlzmmddtm/p/11701343.html
Copyright © 2020-2023  润新知