通用视图
基于类的视图的一个主要优点是它们允许你编写可重复使用的行为。 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)对设置请求中隐含的但不属于请求数据的属性特别有用。











网友评论