一、drf有两大视图类:
1、 APIView :
from rest_framework.views import APIView
APIView继承的是原生的view,可操作性很高,但是需要写的代码也多。
2、GenericAPIView :
from rest_framework.generics import GenericAPIView
GenericAPIView 继承的APIView,多了两条命令。模型类表和序列化,使用统一的变量接收了。
queryset =models.User.objects.all() serializer_class = serializer.UserSerializer
第一个代表的是模型类表
第二个代表的表对应的序列化器的使用
二、五个接口子类:没有都没有继承
ListModelMixin, 查询所有数据
DestroyModelMixin, 删除单个数据
RetrieveModelMixin, 查询单个数据
UpdateModelMixin, 更单个数据
CreateModelMixin,新增单个数据
必须配合:GenericAPIView 或from rest_framework.viewsets import GenericViewSet
区别:
1、GenericAPIView 路由的配置,没有重写as_view()方法,
path('test/',views.Test.as_view()),
2、GenericViewSet内部重写的as_view()方法。可以通过自动生成路由。
from rest_framework import routers rou = routers.SimpleRouter() rou.register('test/',views.Test,'别名') urlpatterns+=rou.urls
想要手动生成路由:path('test/',views.Test.as_view({'get':'retrieve','put':'update','delete':'destroy'})), 这三个请求需要用到数据的id。path('test/',views.Test.as_view({'get':'list','post':'create'})),这两个则不需要数据的id。所以还是使用自动生成最好了。
如何导入五个试图子类:
from rest_framework.mixins import ListModelMixin,DestroyModelMixin,RetrieveModelMixin,UpdateModelMixin,CreateModelMixin
class Test(GenericViewSet,ListModelMixin): #这样实现查询所有数据的接口了,需要什么往里加
queryset =models.User.objects.all()
serializer_class = serializer.UserSerializer
三、9个视图拓展类,
ListAPIView : 获取所有数据 继承了 mixins.ListModelMixin, GenericAPIView
ListCreateAPIView :获取所有数据、新增一条数据
DestroyAPIView :删除一条数据 继承了 mixins.DestroyModelMixin, GenericAPIView
UpdateAPIView:修改一条数据 继承了 mixins.UpdateModelMixin, GenericAPIView
RetrieveUpdateDestroyAPIView:查询单条数据、修改单条数据、删除单条数据
RetrieveAPIView :查询单条数据 继承了 mixins.RetrieveModelMixin, GenericAPIView
RetrieveUpdateAPIView:查询单条数据和修改单条数据
RetrieveDestroyAPIView:查询单条数据和删除单条数据
CreateAPIView:新增单条数据, 继承了 mixins.CreateModelMixin, GenericAPIView
导入:
from rest_framework.generics import
使用:
class Test(ListAPIView):#查询所有数据 queryset =models.User.objects.all() serializer_class =ser.UserSerializer
class Test01(RetrieveAPIView):#查询单条数据 queryset = models.User.objects.all() serializer_class = ser.UserSerializer
url:
path('test/',views.Test.as_view()), path('test/<int:pk>/',views.Test01.as_view()),