通用视图
基于类的视图的一个主要优点是它们允许你编写可重复使用的行为。 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
: 用于从此视图返回对象的查询集。通常,您必须设置此属性,或覆盖get_queryset()
方法。
如果你重写了一个视图方法,在视图方法中,你应该调用get_queryset()
而不是直接访问这个属性,这一点很重要!因为 REST 会在内部对queryset
的结果进行缓存用于后续所有请求。serializer_class
:用于验证和反序列化输入以及序列化输出的序列化类。通常,您必须设置此属性,或覆盖get_serializer_class()
方法。lookup_field
:用于执行各个模型实例的对象查找的模型字段。默认为'pk'
。请注意,使用hyperlinked API
时,如果需要使用自定义值,则需要确保 API 视图和序列化类设置了lookup field
。lookup_url_kwarg
:用于对象查找的 URL 关键字参数。URL conf
应该包含与此值相对应的关键字参数。如果未设置,则默认使用与lookup_field
相同的值。
分页器
与列表视图一起使用时,以下属性用于控制分页。
-
pagination_class
:对列表进行分页时使用的分页类。
默认值与DEFAULT_PAGINATION_CLASS
设置的值相同,即'rest_framework.pagination.PageNumberPagination'
。
过滤器
-
filter_backends
:用于过滤查询集的过滤器后端类的列表。默认值与DEFAULT_FILTER_BACKENDS
设置的值相同。
方法
基本方法
get_queryset(self)
应该返回列表视图的查询集,并应该将其用作查看详细视图的基础。默认返回由 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)
get_object(self)
应该返回详细视图的对象实例。默认使用 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)
filter_queryset(self, queryset)
给定一个查询集,使用过滤器进行过滤,返回一个新的查询集。
get_serializer_class(self)
返回用于序列化的类。默认返回 serializer_class
属性。
保存和删除钩子(hook)
以下方法由 mixin 类提供,可以很轻松的重写对象的保存和删除行为。
perform_create(self, serializer)
:保存新对象实例时由CreateModelMixin
调用。perform_update(self, serializer)
:在保存现有对象实例时由UpdateModelMixin
调用。perform_destroy(self, instance)
:删除对象实例时由DestroyModelMixin
调用。
这些钩子(hook)对设置请求中隐含的但不属于请求数据的属性特别有用。