GenericViewSet视图集

继承自GenericAPIView,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。

GenericAPIVIew的python演示代码如下:

from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet
from book_drf.serializer import BookSerializer
from books.models import BookInfo


class Books(GenericViewSet):
    queryset = BookInfo.objects.all()  # 指定当前类视图使用的查询集数据
    serializer_class = BookSerializer  # 指定当前类视图使用的序列化器

    # 可以自定义方法名
    def list(self, request):
        # 1、查询所有图书对象
        books = self.get_queryset()
        ser = self.get_serializer(books, many=True)
        return Response(ser.data)

    # 可以自定义方法名
    def create(self, request):
        # 此处跟django.views.View
        # 1、获取前端数据
        data = request.data
        # 2、验证数据
        ser = self.get_serializer(data=data)
        ser.is_valid()  # 验证方法

        # 3、保存数据
        ser.save()
        # 4、返回结果
        # 此处跟django.views.View返回不一样
        return Response(ser.data)


class BookDRFView(GenericViewSet):
    queryset = BookInfo.objects.all()  # 指定当前类视图使用的查询集数据
    serializer_class = BookSerializer  # 指定当前类视图使用的序列化器
    """
        获取单一和更新和删除
    """
    # 可以自定义方法名,主要不同点,在路由
    def update(self, request, pk):
        # 1、获取前端数据
        data = request.data
        # 2、验证数据
        try:
            # book = BookInfo.objects.get(id=pk) APIView
            # 此处跟APIView 不一样
            book = self.get_object()  # 从查询集中获取指定的单一数据对象
        except:
            return Response({'error': '错误信息'}, status=400)
        ser = self.get_serializer(book, data=data)
        ser.is_valid()
        print(ser.validated_data)
        print(ser.errors)
        # 3、更新数据
        ser.save()
        # 4、返回结果
        return Response(ser.data)

    def lastdata(self, request, pk):
        # 调用的方式 /books_drf/6/lastdata/
        # 路由配置方法 url(r'^books_drf/(?P<pk>\d+)/lastdata/$', viewset_view.BookDRFView.as_view({'get': 'lastdata'})),
        book = self.get_object()  # 从查询集中获取指定的单一数据对象
        ser = self.get_serializer(book)
        return Response(ser.data)

    def delete(self, request, pk):
        # 1、删除某一个数据对象
        try:
            book = self.get_object()
            book.delete()
        except:
            return Response({'error': '错误信息'}, status=400)
        return Response({})

urls配置路由python代码如下:

from . import genericviewset_view

urlpatterns = [
    # 配置查询所有图书路由
    url(r'^books_drf/$', genericviewset_view.Books.as_view({'get': 'list', 'post': 'create'})),
    url(r'^books_drf/(?P<pk>\d+)/$', genericviewset_view.BookDRFView.as_view({'put': 'update', 'delete': 'delete'})),
    # 匹配与/books_drf/6/lastdata/ 这种形式
    url(r'^books_drf/(?P<pk>\d+)/lastdata/$', genericviewset_view.BookDRFView.as_view({'get': 'lastdata'})),
]