API 指南(4-1):通用视图(generics)

2018-04-25  本文已影响70人  SingleDiego

官方文档

通用视图

基于类的视图的一个主要优点是它们允许你编写可重复使用的行为。 REST framework 通过提供大量预构建视图来提供常用模式,从而充分利用了这一点。

REST framework 提供的通用视图允许您快速构建紧密映射到数据库模型的 API 视图。

如果通用视图不符合需求,可以使用常规的 APIView 类,或者利用 mixin 特性和基类组合出可重用的视图。

例子:

通常,在使用通用视图时,您需要继承该视图,并设置几个类属性。

from django.contrib.auth.models import User
from myApp.serializers import UserSerializer
from rest_framework import generics
from rest_framework.permissions import IsAdminUser

class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsAdminUser,)

对于更复杂的情况,您可能还想重写视图类中的各种方法。例如。

from django.contrib.auth.models import User
from myApp.serializers import UserSerializer
from rest_framework import generics
from rest_framework.permissions import IsAdminUser

class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsAdminUser,)

    def list(self, request):
        # 注意使用`get_queryset()`而不是`self.queryset`
        queryset = self.get_queryset()
        serializer = UserSerializer(queryset, many=True)
        return Response(serializer.data)

对于非常简单的情况,我们可以直接在 urls.py 使用 .as_view() 方法来传递类属性。例如:

# urls.py

from django.contrib.auth.models import User
from myApp.serializers import UserSerializer
from rest_framework import generics

urlpatterns = [
    ......
    url(
        r'^api/test$', 
        generics.ListCreateAPIView.as_view(queryset=User.objects.all(), 
        serializer_class=UserSerializer), 
        name='user-list'
    ),
]

直接在 URLconf 中设置相关属性参数,这样连视图类都不用写了。




GenericAPIView

GenericAPIView 类继承于 REST framework 的 APIView 类,为标准列表和详细视图添加了常见的行为。

内置的每一个具体的通用视图都是通过将 GenericAPIView 类和一个或多个 minxin 类相互结合来构建的。

基本设置

以下属性控制基本视图行为。

分页器

与列表视图一起使用时,以下属性用于控制分页。

过滤器




方法

基本方法

应该返回列表视图的查询集,并应该将其用作查看详细视图的基础。默认返回由 queryset 属性指定的查询集。

应该始终使用此方法, 而不是直接访问 self.queryset,因为 REST 会在内部对 self.queryset 的结果进行缓存用于后续所有请求。

可以覆盖它以提供其他行为:

from django.contrib.auth.models import User
from myApp.serializers import UserSerializer
from rest_framework import generics
from rest_framework.permissions import IsAdminUser

class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsAdminUser,)

    def get_queryset(self):
        return User.objects.filter(pk=1)

应该返回详细视图的对象实例。默认使用 lookup_field 参数来过滤基本查询集。

可以覆盖以提供更复杂的行为:

from django.contrib.auth.models import User
from myApp.serializers import UserSerializer
from rest_framework import generics
from rest_framework.permissions import IsAdminUser

class UserList(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsAdminUser,)

    def get_object(self):
        return User.objects.get(pk=1)

给定一个查询集,使用过滤器进行过滤,返回一个新的查询集。

返回用于序列化的类。默认返回 serializer_class 属性。

保存和删除钩子(hook)

以下方法由 mixin 类提供,可以很轻松的重写对象的保存和删除行为。

这些钩子(hook)对设置请求中隐含的但不属于请求数据的属性特别有用。

上一篇 下一篇

猜你喜欢

热点阅读