最初是通过改写get等方法,代码如下
class PublishView(APIView):
def get(self, request):
publish_list = models.Publish.objects.all()
bs = PublishSerializers(publish_list, many=True)
# 序列化数据
return Response(bs.data)
def post(self, request):
# 添加一条数据
print(request.data)
bs=PublishSerializers(data=request.data)
if bs.is_valid():
bs.save() # 生成记录
return Response(bs.data)
else:
return Response(bs.errors)
然后将重复部分自己抽出
class List():
def list(self,request, *args, **kwargs):
response = {'status': 100, 'msg': '查询成功'}
books=self.model
books_ser=self.model_ser(instance=books,many=True)
response['data']=books_ser.data
return Response(response)
class Create():
def create(self,request, *args, **kwargs):
response = {'status': 100, 'msg': '新增成功'}
try:
book_ser = self.model_ser(data=request.data)
if book_ser.is_valid():
book_ser.save()
response['data'] = book_ser.data
else:
response['msg'] = book_ser.errors
except Exception as e:
response['msg'] = str(e)
return Response(response)
class BooksView(List,Create,APIView):
model=models.Book.objects.all()//要序列化的数据queryset对象
model_ser=BookSerializer//使用的序列化类
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self,request):
return self.create(request)
注意这里的model_ser和mode相当于下面的serializer_class(序列化器)和queryset(视图查询集)这里继承的是APIView基本视图
用drf提供的mixin改写试图函数,抽取相同部分进行封装
from rest_framework.mixins import CreateModelMixin,ListModelMixin,DestroyModelMixin,RetrieveModelMixin,UpdateModelMixin
from rest_framework.generics import GenericAPIView
class BooksView(CreateModelMixin,ListModelMixin,GenericAPIView):
serializer_class=BookSerializer
queryset=models.Book.objects.all()
def post(self,request,*args, **kwargs):
return self.create(request,*args, **kwargs)
def get(self,request,*args, **kwargs):
return self.list(request,*args, **kwargs)
上面继承的是GenericAPIView,因为使用mixin需要用到,他继承了APIView斌在其基础上上添加了查询视图和详情视图的通用支持,如queryset和serializer_class,
但发现多个视图时仍有post等相同部分,再次进行封装,使用generics
from rest_framework.generics import ListAPIView,ListCreateAPIView,RetrieveUpdateDestroyAPIView,DestroyAPIView,CreateAPIView
#它有两个接口,一个是获取所有,一个是新增
class BooksView(ListCreateAPIView):
serializer_class=BookSerializer
queryset=models.Book.objects.all()
这里只需要继承上述引入的view即可,但其可控性差,而且还需要分多各类所以有modelviewset但
最终,一般用的时候,会经常用ViewSetMixin
ViewSetMixin干了什么事?重写了as_view方法
from rest_framework.viewsets import ViewSetMixin
class Publish(ViewSetMixin,APIView):
def aa(self,request):
return HttpResponse('aa')
def bb(self,request):
return HttpResponse('aa')
def cc(self,request):
return HttpResponse('aa')
def dd(self,request):
return HttpResponse('aa')
def get_all(self,request):
pass
def get_one(self,request):
pass
def create(self,request):
pass
def create_by_id(self,request):
pass
上面继承的两个类中viewsetmixin必须放在前面,因为viewsetmixin本质是改写了asview方法,放后面会执行APIView中的asviw,另外上面这种方法的url为(列举)
url(r'^test', views.Publish.as_view({'get':'aa'})),
url(r'^xx', views.Publish.as_view({'post':'cc'})),
表示什么请求执行其中的什么方法