美文网首页
API 指南(4-1):通用视图(generics)

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

作者: SingleDiego | 来源:发表于2018-04-25 15:25 被阅读70次

官方文档

通用视图

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

相关文章

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

    官方文档 通用视图 基于类的视图的一个主要优点是它们允许你编写可重复使用的行为。 REST framework 通...

  • Generic views - Django REST fram

    泛型视图-Django REST框架 mixins.py generics.py 泛型视图 姜戈的一般观点..。作...

  • Django 框架之 通用视图

    知识点 通用视图概念和基本用法 基于类的视图的分类、写法和使用 简介 通用试图概念 通用视图是Django为解决建...

  • 通用视图

    这里又一次是这本书的反复出现的主题:最糟糕的是,Web开发是枯燥而单调的。 到目前为止,我们已经介绍了Django...

  • 微信小程序资源汇总整理

    相关文档 官方文档 简易教程 设计指南 开发者工具文档 API 文档 视图组件文档 常见问题 微信 UI/WEB ...

  • TypeScript ——泛型

    前言:泛型的英译generics [dʒɪˈnɛrɪks] 泛型;;范型;通用类型; 通用类型这四个字就是泛型的真...

  • Flink-Gelly: 通用 Graph API 指南

    Gelly简介 Gelly是Flink的图API库,它包含了一组旨在简化Flink中图形分析应用程序开发的方法和实...

  • Django REST framework框架API接口序列化之

    一、重点是用到 rest_framework框架的 generics脚本文件,在view视图中导入 from re...

  • 创建通用视图

    我们给应用创建了一个 default 视图,并将其放在 layouts 文件夹中,default 视图将作为整个应...

  • Django - 通用视图

    参考:http://www.yiibai.com/django/django_generic_views.html...

网友评论

      本文标题:API 指南(4-1):通用视图(generics)

      本文链接:https://www.haomeiwen.com/subject/ufeelftx.html