ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

rest_framework框架视图

2022-07-18 14:03:41  阅读:176  来源: 互联网

标签:ser self request rest framework book 视图 pk import


视图:restframework中提供了两个视图基类,APIView和GenericAPIView

那么这两个视图基类有什么区别呢,本质上是差不多,但是GenericAPIView在APIView的基础上封装了一层,

这使得我们在实现相同功能的情况下书写的代码更少



1 基于APIView写接口

点击查看代码
# url.py
from django.urls import path,re_path
from app01 import views
urlpatterns = [
    path('api/book/',views.BookView.as_view()),
    re_path(r'^api/book/(?P<pk>\d+)',views.BookDetailView.as_view())
]


# models.py
class Book(models.Model):
    name=models.CharField(max_length=32)
    price=models.CharField(max_length=32)



# ser.py
from rest_framework import serializers
from app01.models import Book

# Book模型类的序列化器
# 这里我们为了方便不书写任何校验规则
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model=Book
        fields='__all__'




# view.py
from rest_framework.views import APIView
from rest_framework.response import Response
from app01.models import Book
from app01.ser import BookSerializer
class BookView(APIView):
    def get(self,reqeust):
        book_list=Book.objects.all()
        book_ser=BookSerializer(instance=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({'status':200,'msg':'success'})
        return Response({'status':101,'msg':'error'})


class BookDetailView(APIView):
    def get(self,request,pk):
        book=Book.objects.filter(pk=pk).first()
        book_ser=BookSerializer(instance=book)
        return Response(book_ser.data)

    def put(self,request,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)
        return Response({'status':101,'msg':'error'})

    def delete(self,request,pk):
        Book.objects.filter(pk=pk).delete()
        return Response({'status':200,'msg':'success'})


可以发现这样书写非常繁琐,当我们有多张表需要操作是很麻烦


2 基于GenericAPIView写接口

继承关系:GenerciAPIView继承了APIView
在APIV的基础上拓展了一些方法,比如获取对象queryset对象,和获取序列化器的方法
所以我们在书写继承GenericAPIView接口类是要书写 queryset = 模型类.objects.all() | serializer_class = 序列化器

接口示例

点击查看代码
# url.py
from django.urls import path,re_path
from app01 import views
urlpatterns = [
    path('api/book/',views.BookView.as_view()),
    re_path(r'^api/book/(?P<pk>\d+)',views.BookDetailView.as_view())
]



# models.py
class Book(models.Model):
    name=models.CharField(max_length=32)
    price=models.CharField(max_length=32)




# ser.py
from rest_framework import serializers
from app01.models import Book

# Book模型类的序列化器
# 这里我们为了方便不书写任何校验规则
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model=Book
        fields='__all__'





# views.py
from rest_framework.generics import GenericAPIView
from app01.models import Book
from app01.ser import BookSerializer
from rest_framework.response import Response
class BookView(GenericAPIView):
    queryset=Book.objects.all()
    serializer_class = BookSerializer
    def get(self,request):
        book_list=self.get_queryset()
        book_ser=self.get_serializer(instance=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({'status':200,'msg':'success'})
        return Response({'status':101,'msg':'error'})



class BookDetailView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    def get(self,request,pk):
        book=self.get_queryset().filter(pk=pk).first()
        book_ser=self.get_serializer(instance=book)
        return Response(book_ser.data)

    def put(self,request,pk):
        book=self.get_queryset().filter(pk=pk).first()
        book_ser=self.get_serializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        return Response({'status':101,'msg':'error'})

    def delete(self,request,pk):
        self.get_queryset().filter(pk=pk).delete()
        return Response({'status':200,'msg':'success'})


2.1 基于GenericAPIView的5个视图扩展类写的接口

点击查看代码
# views.py
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import CreateModelMixin,DestroyModelMixin,RetrieveModelMixin,ListModelMixin,UpdateModelMixin
from app01.models import Book
from app01.ser import BookSerializer


class BookView(GenericAPIView,ListModelMixin,CreateModelMixin):
    queryset = Book.objects
    serializer_class = BookSerializer
    def get(self,request):
        return self.list(request)

    def post(self,request):
        return self.create(request)

class BookDetailView(GenericAPIView,DestroyModelMixin,RetrieveModelMixin,UpdateModelMixin):
    queryset = Book.objects
    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)


3 ViewSetMixin

ViewSetMixin的导入: from rest_framework.viewsets import ViewSetMixin
主要作用:我们在写视图类是,内如接受各种请求方式的函数名字是固定的,而通过ViewSetMixin就可修改视图类中的函数名称,比如:原来我们接受get请求的函数定义def get(self,request): 而通过ViewSetMixin可以自定义为def get_all_book(self,request):

3.1 ViewSetMixin的使用

点击查看代码
# url.py
from django.urls import path,re_path
from app01 import views
urlpatterns = [
    path('api/book/',views.BookView.as_view({'get':'get_all_book'})), #需要在as_view中声明,应为ViewSetMixin重写了as_view方法
    # re_path(r'^api/book/(?P<pk>\d+)',views.BookDetailView.as_view())
]


# views.py
from rest_framework.viewsets import ViewSetMixin
from rest_framework.views import APIView
from app01.ser import BookSerializer
from app01.models import Book
from rest_framework.response import Response
class BookView(ViewSetMixin,APIView): # 继承的类第一个必须是ViewSetMixin,应为ViewSetMixin重写了as_view方法
    def get_all_book(self,request):
        book_list=Book.objects.all()
        book_ser=BookSerializer(instance=book_list,many=True)
        return Response(book_ser.data)



4 基于ModelViewSet编写接口

继承关系:modelViewSet继承了GenerciAPIView和其五个视图扩展方法

点击查看代码
# url.py
from django.urls import path,re_path
from app01 import views
urlpatterns = [
    path('api/book/',views.BookView.as_view({'get':'list','post':'create'})),
    re_path(r'^api/book/(?P<pk>\d+)',views.BookView.as_view({'get':'retrieve','put':'update','delete':'destroy'}))
]




# views.py
from rest_framework.viewsets import ViewSetMixin,ViewSet,ModelViewSet,GenericViewSet
from rest_framework.views import APIView
from app01.ser import BookSerializer
from app01.models import Book
from rest_framework.response import Response


class BookView(ModelViewSet):
    queryset = Book.objects
    serializer_class = BookSerializer


总结

可以发现,通过一步一步封装,我们所需要书写的代码越来越少

关系

image

标签:ser,self,request,rest,framework,book,视图,pk,import
来源: https://www.cnblogs.com/mress/p/16488488.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有