DRF 视图集


demo

from django.contrib.auth.models import User
from django.shortcuts import get_object_or_404
from myapps.serializers import UserSerializer
from rest_framework import viewsets
from rest_framework.response import Response

class UserViewSet(viewsets.ViewSet):
    """
    A simple ViewSet for listing or retrieving users.
    """
    def list(self, request):
        queryset = User.objects.all()
        serializer = UserSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        queryset = User.objects.all()
        user = get_object_or_404(queryset, pk=pk)
        serializer = UserSerializer(user)
        return Response(serializer.data)

注册视图 
--------------url.py----------------
from myapp.views import UserViewSet
from rest_framework.routers import DefaultRouter
# 利用DRF 的rotter 注册路由
router = DefaultRouter()
router.register(r'users', UserViewSet, basename='user')
urlpatterns = router.urls

# 也可以在DJango 的path 单独中 注册, 需要绑定单独的视图
user_list = UserViewSet.as_view({'get': 'list'})
user_detail = UserViewSet.as_view({'get': 'retrieve'})

特点1 一个视图集绑定的url 没有限制 action 函数装饰器

实现之后的MOdel ViewSet

特点 2 默认有五个方法对应五个请求

优势再加上

  • 重复的逻辑可以合并为一个类。在上面的示例中,我们只需要指定queryset一次,它将在多个视图中使用。
  • 通过使用路由器,我们不再需要自己处理URL conf。
class UserViewSet(viewsets.ModelViewSet):
    """
    A viewset for viewing and editing user instances.
    """
    serializer_class = UserSerializer
    queryset = User.objects.all()

 # 默认有五个方法对应五个请求: list,retrieve,create,update,destroy,partial_update


    属性
basename -用于创建的URL名称的基础
action-当前动作的名称例如listcreate)。

detail -布尔值指示是否为列表视图或详细信息视图配置了当前操作 路径是否接受额外参数

detail: 声明该action的路径是否与单一资源对应及是否是xxx/<pk>/action方法名/
        True 表示路径格式是xxx/<pk>/action方法名/
        False 表示路径格式是xxx/action方法名/

suffix-视图集类型的显示后缀-镜像detail属性
name-视图集的显示名称此参数与互斥suffix
description -视图集单个视图的显示描述


# 根据action 给权限该方法drf默认调用

def get_permissions(self):
    """
    Instantiates and returns the list of permissions that this view requires.
    """
    if self.action == 'list':
        permission_classes = [IsAuthenticated]
    else:
        permission_classes = [IsAdmin]
    return [permission() for permission in permission_classes]


反向操作
view.reverse_action('set-password', args=['1'])
view.reverse_action(view.set_password.url_name, args=['1'])
'http://localhost:8000/api/users/1/set_password'

继承关系

视图集
该ViewSet班继承来自APIView您可以使用任何标准的属性如permission_classesauthentication_classes以控制在视图集的API政策

本ViewSet类不提供任何操作实现为了使用一个ViewSet类您将覆盖该类并显式定义动作实现

通用视图集
该GenericViewSet班继承从GenericAPIView并提供get_objectget_queryset方法和其他常规视图基本行为的默认集合但默认情况下不包含任何操作

为了使用一个GenericViewSet类您将覆盖该类并混合所需的mixin类或显式定义操作实现

模型视图集
该ModelViewSet班继承从GenericAPIView并且包括用于各种动作实现方式中通过在各种混入类的行为混合

由提供的动作ModelViewSet类是.list().retrieve() .create().update().partial_update().destroy()


由于ModelViewSetextends GenericAPIView通常需要至少提供queryset和serializer_class属性例如

ReadOnlyModelViewSet
该ReadOnlyModelViewSet班还继承来自GenericAPIView与一样ModelViewSet它也包含各种动作的实现但与ModelViewSet只提供只读动作不同.list().retrieve()


自定义ViewSet基类 您可能需要提供ViewSet没有完整ModelViewSet动作集或以其他方式自定义行为的自定义类。

例 要创建基础视图集类,提供create,list和retrieve操作,继承从中GenericViewSet,并混合所需的操作

from rest_framework import mixins

class CreateListRetrieveViewSet(mixins.CreateModelMixin,
                                mixins.ListModelMixin,
                                mixins.RetrieveModelMixin,
                                viewsets.GenericViewSet):
    """
    A viewset that provides `retrieve`, `create`, and `list` actions.

    To use it, override the class and set the `.queryset` and
    `.serializer_class` attributes.
    """
    pass