在DRF中,推荐使用类视图,因为类视图可以通过继承的方式把一些重复性的工作抽取出来,而使得代码更加简洁。当然如果你不想使用类视图,那么就用@api_view装饰器包裹一下就可以。
APIView是DRF中类视图最基本的父类。基本用法跟Django中自带的View类是一样的。也是自己分别实现get、post等方法。示例代码如下:
class MerchantView(APIView):
"""
检索, 更新和删除一个merchant实例对象.
"""
def get_object(self, pk):
try:
return Merchant.objects.get(pk=pk)
except Merchant.DoesNotExist:
raise Http404
def get(self, request, pk=None):
if pk:
merchant= self.get_object(pk)
serializer = MerchantSerializer(merchant)
return Response(serializer.data)
else:
queryset = Merchant.objects.all()
serializer = MerchantSerializer(instance=queryset,many=True)
return Response(serializer.data)
def put(self, request, pk):
merchant = self.get_object(pk)
serializer = MerchantSerializer(merchant, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
merchant= self.get_object(pk)
merchant.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
当然APIView中还继承了一些常用的属性,比如authentication_classes、permission_classes、throttle_classes等。
mixins翻译成中文是混入,组件的意思。在DRF中,针对获取列表,检索,创建等操作,都有相应的mixin。示例代码如下:
from .models import Merchant
from .serializers import MerchantSerializer
from rest_framework import mixins
from rest_framework import generics
class MerchantView(
generics.GenericAPIView,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin
):
queryset = Merchant.objects.all()
serializer_class = MerchantSerializer
def get(self,request,pk=None):
if pk:
return self.retrieve(request)
else:
return self.list(request)
def post(self,request):
return self.create(request)
def put(self,request,pk=None):
return self.update(request)
def delete(self,request,pk=None):
return self.destroy(request)
以上我们通过继承generics.GenericAPIView,可以设置queryset以及serializer_class,那么视图函数就知道你是要针对哪个模型做处理,你的序列化的类是什么了。接着我们继承mixins.ListModelMixin/CreateModelMixin类,这样MerchantList就拥有了获取列表,以及创建数据的功能。下面我们通过写get和post方法,调用self.list和self.create方法,就可以轻松的实现获取商家列表和创建商家的功能。
以上我们通过mixin可以非常方便的实现一些CURD操作。实际上针对这些mixin,DRF还进一步的进行了封装,放到generics下。有以下generic类视图:
generics.ListAPIView:实现获取列表的。实现get方法。generics.CreateAPIView:实现创建数据的。实现post方法。generics.UpdateAPIView:实现更新数据的。实现put方法。generics.DestroyAPIView:实现删除数据的。实现delete方法。generics.RetrieveAPIView:实现检索数据的。generics.ListCreateAPIView:实现列表和创建数据的。generics.RetrieveUpdateAPIView:实现检索和更新数据的。generics.RetrieveDestroyAPIView:实现检索和删除数据的。