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
原文地址:https://www.cnblogs.com/LZXlzmmddtm/p/11701343.html