类视图

在DRF中,推荐使用类视图,因为类视图可以通过继承的方式把一些重复性的工作抽取出来,而使得代码更加简洁。当然如果你不想使用类视图,那么就用@api_view装饰器包裹一下就可以。

APIView:

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:

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方法,就可以轻松的实现获取商家列表和创建商家的功能。

Generic类视图:

以上我们通过mixin可以非常方便的实现一些CURD操作。实际上针对这些mixin,DRF还进一步的进行了封装,放到generics下。有以下generic类视图:

  1. generics.ListAPIView:实现获取列表的。实现get方法。
  2. generics.CreateAPIView:实现创建数据的。实现post方法。
  3. generics.UpdateAPIView:实现更新数据的。实现put方法。
  4. generics.DestroyAPIView:实现删除数据的。实现delete方法。
  5. generics.RetrieveAPIView:实现检索数据的。
  6. generics.ListCreateAPIView:实现列表和创建数据的。
  7. generics.RetrieveUpdateAPIView:实现检索和更新数据的。
  8. generics.RetrieveDestroyAPIView:实现检索和删除数据的。