视图代码

基于APIView五个接口

"""第一层"""
from rest_framework.views import APIView


class BookAPIView(APIView):
    def get(self, request):
        book_list = Book.objects.all()
        ser = BookSerializer(instance=book_list,many=True)
        return Response(ser.data)

    def post(self, request):
        ser = BookSerializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)


class BookDetailAPIView(APIView):
    def put(self, request, pk):
        book = Book.objects.filter(pk=pk).first()
        ser = BookSerializer(instance=book,data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)

    def get(self, request, pk):
        book = Book.objects.all().filter(pk= pk).first()
        ser = BookSerializer(instance=book)
        return Response(ser.data)

    def delete(self, request, pk):
        Book.objects.filter(pk=pk).delete()
        return Response()

基于GenricAPIView

from rest_framework.generics import GenericAPIView


class BookAPIView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def get(self, request):
        ser = self.get_serializer(instance=self.get_queryset(), many=True)
        return Response(ser.data)

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)


class BookDetailAPIView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def put(self, request, pk):
        ser = self.get_serializer(instance=self.get_object(), data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)

    def get(self, request, pk):
        ser = self.get_serializer(instance=self.get_object())
        return Response(ser.data)

    def delete(self, request, pk):
        self.get_object().detele()
        return Response()

类中源码方法解析

image
image

image
image

基于五个视图扩展类五个接口

from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, \
    DestroyModelMixin

"""获取所有数据接口"""


class BookGenericList(GenericAPIView, ListModelMixin, CreateModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class BookGeneric(GenericAPIView, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

封装之后的视图子类

from rest_framework.generics import ListAPIView, CreateAPIView, UpdateAPIView, RetrieveAPIView, DestroyAPIView


class BookView(ListAPIView, CreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer


class BookDetail(UpdateAPIView, RetrieveAPIView, DestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
	
	
	
路由
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    path('books/', views.BookView.as_view()),  # 获取所有创建
    path('books/<int:pk>', views.BookDetail.as_view()),  # 获取单个更新删除
	
	

继承视图子类之后内部封装了五个请求方法不需要写


# 封装之后的LIstAPIView
class ListAPIView(mixins.ListModelMixin,
                  GenericAPIView):
    """
    Concrete view for listing a queryset.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)
		
		
		
# 视图源码
class ListModelMixin:
    """
    List a queryset.
    """
    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)
		
		

路由自动生成与自己写的路由获取所有与获取单条数据需要区分

  • 自己写的路由没有重写as_view方法没有对应关系视图类需要分两个视图类写
    • path('books/', views.BookView.as_view()),
    • path('books/int:pk', views.BookDetail.as_view()),
  • 重写了as_view在路由中写好对应关系后不需要分开写两个类
    • path('books/', views.BookView.as_view({'get':'list','post':'create'}))
    • path('books/int:pk',views.BookView.as_view({'put':'update','get':'retrieve','delete':'destroy'}))
posted @ 2022-10-08 19:28  懒羊羊A  阅读(45)  评论(0)    收藏  举报