DRF的视图和路由

DRF视图python

APIviewdjango

django中写CBV的时候是继承View,而rest_framework继承的是APIView,那么他们两个有什么不一样ide

urlpatterns = [
    url(r'^book$', BookView.as_view()),
    url(r'^book/(?P<id>\d+)$', BookEditView.as_view()),
]

 无论是View仍是APIView最开始调用的都是as_view()方法,看源码有什么区别函数

咱们能看到,APIView继承了View, 而且执行了View中的as_view()方法,最后把view返回了,用csrf_exempt()方法包裹后去掉了csrf的认证。post

而后看view中as_view()方法作了什么url

在View中的as_view方法返回了view函数,而view函数执行了self.dispatch()方法 ,可是这里的dispatch方法按照顺序应该从本身开始寻找,而在APIview中,也写了dispatch方法,因此应该执行的是APIview中的dispatch方法spa

这里我我须要注意initialize_request中到底作了什么3d

 这里返回的是一个实例化对象rest

这会django原先的request变成了self._requestcode

 

 

 

 

 视图

本身写的版本

# 本身重写的视图
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.viewsets import ViewSetMixin
# 获取要的数据
class GenericAPIView(APIView):
    queryset = None
    serializer_class = None

    # 获取queryset
    def get_queryset(self):
        return self.queryset.all()

    # 获取序列化器
    def get_serializer(self, *args, **kwargs):
        return self.serializer_class(*args, **kwargs)


# get方法(查询多条)
class ListModelMixin(object):
    def list(self, request):
        queryset = self.get_queryset()
        ser_obj = self.get_serializer(queryset, many=True)
        return Response(ser_obj.data)


# 查询单条
class RetrieveModelMixin(object):
    def retrieve(self, request, id):
        stu_obj = self.get_queryset().filter(id=id).first()
        ser_obj = self.get_serializer(stu_obj)
        return Response(ser_obj.data)


# post方法
class CreateModelMixin(object):
    def create(self, request):
        ser_obj = self.get_serializer(data=request.data)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response(ser_obj.data)
        else:
            return Response(ser_obj.errors)


# put/patch方法:修改单个的
class UpdateModelMixin(object):
    def update(self, request, id):
        stu_obj = self.get_queryset().filter(id=id).first()
        ser_obj = self.get_serializer(instance=stu_obj, data=request.data, partial=True)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response(ser_obj.validated_data)
        return Response(ser_obj.errors)


# delete方法
class DestroyModelsMixin(object):
    def destroy(self, request, id):
        stu_obj = self.get_queryset().filter(id=id).first()
        if stu_obj:
            stu_obj.delete()
            return Response("")
        return Response("删除的对象不存在")


# # 全部方法只要继承这个就能够
class ModelViewSet(
    ViewSetMixin,
    GenericAPIView,
    ListModelMixin,
    RetrieveModelMixin,
    CreateModelMixin,
    UpdateModelMixin,
    DestroyModelsMixin,

):
    pass

class Student(ModelViewSet):
    queryset = models.Student.objects
    serializer_class = StudentSerializer
本身重写的

 

他还有一个自带的模块和这个同样

from rest_framework.viewsets import ModelViewSet
class Student(ModelViewSet):
    queryset = models.Student.objects
    serializer_class = StudentSerializer
自带的模块

 

urls.py代码

 

 

 

 

DRF的路由

 这个路由其实也封装好了,可是封装越好的东西,应用场景限制的也越多

from .views import BookView
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r"book", BookView)

urlpatterns = [
    # url(r'^book$', BookView.as_view()),
    # url(r'^book/(?P<id>\d+)$', BookEditView.as_view()),
    # url(r'^book$', BookView.as_view({"get": "list", "post": "create"})),
    # url(r'^book/(?P<pk>\d+)$', BookView.as_view({"get": "retrieve", "patch": "update", "delete": "destroy"})),

]
urlpatterns += router.urls
路由
相关文章
相关标签/搜索