• RESTful API终极版序列化封装


    urls:

    from django.conf.urls import url
    from app01 import views
    
    urlpatterns = [
        # url(r"comment/$",views.Comment.as_view()),
        url(r"comment/(?P<pk>d+)",views.CommentDetailView.as_view()),
        url(r"article/$",views.Article.as_view()),
        url(r"school/(?P<id>d+)",views.SchoolDetail.as_view(),name="school-detail"),
        url(r"school_view/$",views.SchoolView.as_view(),name="school_view-detail"),
        url(r"comment_view/$",views.CommentView.as_view(),name="comment_view-detail"),
        url(r"article/(?P<pk>d+)",views.ArticleDetail.as_view(),name="article-detail"),
    
    
        # url(r'comment/$',views.CommentViewSet.as_view({
        #     "get":"list",
        #     "put":"create",
        # })),
        #
        # url(r'comment/(?P<pk>d+)/$',views.CommentViewSet.as_view({
        #     "get":"retrieve",
        #     "put":"update",
        #     "delete":"destroy"
        # }))
    
    ]
    
    from rest_framework.routers import DefaultRouter
    
    router = DefaultRouter()
    router.register(r'comment',views.CommentViewSet)
    urlpatterns += router.urls
    
    
    #   相当于 在urlpatterns里添加了:
        # url(r'comment/$',views.CommentViewSet.as_view({
            #     "get":"list",
            #     "put":"create",
            # })),
            #
            # url(r'comment/(?P<pk>d+)/$',views.CommentViewSet.as_view({
            #     "get":"retrieve",
            #     "put":"update",
            #     "delete":"destroy"
            # }))

    views:此处为RESTful API 终极版:

    from django.shortcuts import render,HttpResponse
    from django.http import JsonResponse
    from app01 import models
    from rest_framework import serializers
    from django import views
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from app01 import serializers as app01_serializers
    from rest_framework.generics import GenericAPIView
    from rest_framework.mixins import ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
    from rest_framework.generics import GenericAPIView, RetrieveUpdateDestroyAPIView, ListCreateAPIView
    from rest_framework.viewsets import ModelViewSet
    
    
    
    # ==================================================================
    # 95天内容
    
    
    # 第一种方式:
    
    # class CommentView(APIView):
    #     def get(self,request):
    #         query_set = models.Comment.objects.all()
    #         ser_obj = app01_serializers.CommentSerializer(query_set,many=True)
    #         return Response(ser_obj.data)
    
    # 使用封装类后:
    
    # class CommentView(GenericAPIView,ListModelMixin,CreateModelMixin):
        """
        GenericAPIView
        只需要配置
        queryset 和 serializer_class 即可
        """
    
        # queryset = models.Comment.objects.all()  # 指定queryset对象
        # serializer_class = app01_serializers.CommentSerializer  # 指定类序列化
        #
        # def get(self,request, *args, **kwargs):
        #     return self.list(request, *args, **kwargs)
    
        # list方法为 ListModelMixin内部封装的函数,其源码为:
        # def list(self, request, *args, **kwargs):
        #     queryset = self.filter_queryset(self.get_queryset())
        #
        #     page = self.paginate_queryset(queryset)
        #     if page is not None:
        #         serializer = self.get_serializer(page, many=True)
        #         return self.get_paginated_response(serializer.data)
        #
        #     serializer = self.get_serializer(queryset, many=True)
        #     return Response(serializer.data)
        # 其实质与之前我们使用APIView一样,
        # post 同理
    
        # def post(self,request, *args, **kwargs):
        #     print("评论区")
        #     return self.create(request, *args, **kwargs)
    
    # 评论详情:
    
    # class CommentDetailView(GenericAPIView,RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin):
    #     queryset = models.Comment.objects.all()
    #     serializer_class = app01_serializers.CommentSerializer
    #
    #     def get(self,request,pk):
    #         return self.retrieve(request,pk)
    #
    #     def delete(self,request,pk):
    #         return self.destroy(request,pk)
    #
    #     def perform_destroy(self, instance):
    #         "someting code"
    #         # 可以在删除之前做的一些操作
    #         instance.delete()
    #
    #     def put(self,request,pk):
    #         return self.update(request,pk)
    
    
    class SchoolView(GenericAPIView,ListModelMixin):
        queryset = models.Comment.objects.all()
        serializer_class = app01_serializers.CommentSerializer
    
        def get(self,request,*args,**kwargs):
            return self.list(request, *args,**kwargs)
    
    
    
    # 第二种方式
    class CommentDetailView(RetrieveUpdateDestroyAPIView):
    
        # RetrieveUpdateDestroyAPIView  相当于封装了GenericAPIView
        # RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin 这四个
        # 可以进行查看,更改和删除操作。
        queryset = models.Comment.objects.all()
        serializer_class = app01_serializers.CommentSerializer
    
    #
    class CommentView(ListCreateAPIView):
        # ListCreateAPIView:内封装了 ListModelMixin CreateModelMixin
        queryset =models.Comment.objects.all()
        serializer_class = app01_serializers.CommentSerializer
    
    
    # 第三种方式:
    # 终极版:
    class CommentViewSet(ModelViewSet):
        queryset = models.Comment.objects.all()
        serializer_class = app01_serializers.CommentSerializer
  • 相关阅读:
    svg文件使用highmap显示
    动静分离
    angular 零碎
    使用doxmate生成文档
    javascript之console篇
    java 中String与StringBuilder 效率
    highcharts 组合chart
    js 攻坚克难
    html base 又一重大发现
    sql 分析 依赖beanutils
  • 原文地址:https://www.cnblogs.com/stfei/p/9409865.html
Copyright © 2020-2023  润新知