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-当前动作的名称(例如list,create)。
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_classes,authentication_classes以控制在视图集的API政策。
本ViewSet类不提供任何操作实现。为了使用一个ViewSet类,您将覆盖该类并显式定义动作实现。
通用视图集
该GenericViewSet班继承从GenericAPIView,并提供get_object,get_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