• 视图


    基于APIView写接口

    # views.py
    # 基于APIView写的
    # class BookView(APIView):
    #     def get(self, request):
    #         book_list = Book.objects.all()
    #         book_ser = BookSerializer(book_list, many=True)
    #         return Response(book_ser.data)
    #
    #     def post(self, request):
    #         book_ser = BookSerializer(data=request.data)
    #         if book_ser.is_valid():
    #             book_ser.save()
    #             return Response(book_ser.data)
    #         else:
    #             return Response({'status': 101, 'msg': '校验失败'})
    #
    #
    # class BookDataView(APIView):
    #     def get(self, request, pk):
    #         book = Book.objects.all().filter(pk=pk).first()
    #         book_ser = BookSerializer(book)
    #         return Response(book_ser.data)
    #
    #     def put(self, request, pk):
    #         print(pk)
    #         book = Book.objects.filter(pk=pk).first()
    #         book_ser = BookSerializer(instance=book, data=request.data)
    #         if book_ser.is_valid():
    #             book_ser.save()
    #             return Response(book_ser.data)
    #         else:
    #             return Response({'status': 101, 'msg': '校验失败'})
    #
    #     def delete(self,request,pk):
    #         ret = Book.objects.filter(pk=pk).delete()
    #         return Response({'status': 100, 'msg': '删除成功'})
    
    
    # models.py:
    from django.db import models
    
    # Create your models here.
    
    class Book(models.Model):
        name = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=5,decimal_places=2)
        publish = models.CharField(max_length=32)
        
    # ser.py
    from rest_framework import serializers
    from app01.models import Book
    
    
    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = '__all__'
            
    # urls.py:
        path('books/', views.BookView.as_view()),
        re_path('books/(?P<pk>d+)', views.BookDataView.as_view()),

    基于GenericAPIView写的接口

    # views.py:
    # 基于GenericAPIView写的
    
    class BookView(GenericAPIView):
        # queryset要传queryset对象,查询了所有的图书
        # serializer_class使用了哪个序列化类来序列化这堆数据
        # queryset = Book.objects.all()
        queryset = Book.objects
        serializer_class = BookSerializer
    
        def get(self, request):
            book_list = self.get_queryset()
            book_ser = self.get_serializer(book_list, many=True)
            return Response(book_ser.data)
    
        def post(self, request):
            book_ser = self.get_serializer(data=request.data)
            if book_ser.is_valid():
                book_ser.save()
                return Response(book_ser.data)
            else:
                return Response({'status': 101, 'msg': '校验失败'})
    
    
    class BookDataView(GenericAPIView):
        queryset = Book.objects
        serializer_class = BookSerializer
    
        def get(self, request, pk):
            book = self.get_object()
            book_ser = self.get_serializer(book)
            return Response(book_ser.data)
    
        def put(self, request, pk):
            print(pk)
            book = self.get_object()
            book_ser = self.get_serializer(instance=book, data=request.data)
            if book_ser.is_valid():
                book_ser.save()
                return Response(book_ser.data)
            else:
                return Response({'status': 101, 'msg': '校验失败'})
    
        def delete(self, request, pk):
            ret = self.get_object().delete()
            return Response({'status': 100, 'msg': '删除成功'})
    
    # urls.py:
        # 使用GenericAPIView重写的
        path('books/', views.BookView.as_view()),
        re_path('books/(?P<pk>d+)', views.BookDataView.as_view()),

    基于GenericAPIView和五个视图扩展类写的接口

    from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, 
        DestroyModelMixin
    # views.py:
    class BookListView(ListModelMixin, GenericAPIView, CreateModelMixin):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
    
        def get(self, request):
            return self.list(request)
    
        def post(self, request):
            return self.create(request)
    
    
    class Book3DetailView(GenericAPIView, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
    
        def get(self, request, pk):
            return self.retrieve(request, pk)
    
        def put(self, request, pk):
            return self.update(request, pk)
    
        def delete(self, request, pk):
            return self.destroy(request, pk)

    GenericAPIView的视图子类

    # views.py:
    # 使用ModelViewSet编写5个接口
    from rest_framework.viewsets import ModelViewSet
    
    class Book5View(ModelViewSet):  # 5个接口都有,但是路由有点问题
        queryset = Book.objects.all()
        serializer_class = BookSerializer
        
       
    # urls.py:
    # 使用ModelViewSet编写5个接口
        path('books5/', views.Book5View.as_view(actions={'get': 'list', 'post': 'create'})),
        re_path('books5/(?P<pk>d+)',
                views.Book5View.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

    源码分析ViewSetMixin

    # 重写了as_view
    # 核心代码(所以说路由中只要配置了对应关系,比如{'get':'list'},当get请求来,就会执行list方法
        for method, action in actions.items():
            # method:get
            # action:list
            handler = getattr(self, action)
            # 执行完上一句,handler就变成了list的内存地址
            setattr(self, method, handler)
            # 执行完上一句 对象.get=list
            # for循环完毕 对象.get:对着list  对象.post:对着create

    继承ViewSetMixin的视图类

    # views.py:
    from rest_framework.viewsets import ViewSetMixin
    
    class Book6View(ViewSetMixin, APIView):  # 一定要放在APIView前面,继承的顺序:先找自己的,然后再从第一个父类中找,再找后面的,先执行谁就把谁放前面
        def get_all_book(self, request):
            print('执行了这个')
            book_list = Book.objects.all()
            book_ser = BookSerializer(book_list, many=True)
            return Response(book_ser.data)
    
     
    # urls.py:
        # 继承ViewSetMixin的视图类,路由可以改写成这样
        path('books6/', views.Book6View.as_view(actions={'get': 'get_all_book'})),

     

  • 相关阅读:
    十大佛教经典语,你最中意哪一句
    哲理人生名句, 拿个本子记下来
    逸乐有节 不可过度
    教你怎么用59秒就能打动客户?
    爱的意义
    一个聪明女人写的日记(转)
    做人做事十三条铁则
    爱上一个人的7个征兆
    办公室白领须知的18个定律
    生活智慧:奇特的人生法则
  • 原文地址:https://www.cnblogs.com/ZhZhang12138/p/14875838.html
Copyright © 2020-2023  润新知