• DRF--视图集


    @api_view()

    在DRF中,也可以使用常规的基于函数的视图,DRF提供了一组简单的装饰器,用来包装你的视图函数,以确保视图函数会收到Request(而不是Django原始的HttpRequest)对象。并且返回Response(而不是Django中的HttpResponse)对象。同时允许你设置这个请求的处理方式。

    @api_view()装饰器

    语法:@api_view(http_method_names=['GET'], exclude_from_schema=False)

    api_view()装饰器的主要参数是响应的HTTP方法的列表。比如,你可以像这样写一个返回一些数据的非常简单的视图。

    from rest_framework.decorators import api_view
    from rest_framework.response import Response
    
    
    @api_view()
    def hello_world(request):
        return Response({"message": "Hello, world!"})

    这个视图会使用settings中指定的默认的渲染器,解析器,认证类等等。

    默认情况下,只要GET请求会被接收。其他的请求方法会得到一个”405 Method Not Allowed“的响应。但是,可以自己添加请求的方式。

    from rest_framework.decorators import api_view
    from rest_framework.response import Response
    
    
    @api_view(['GET', 'POST'])
    def hello_world(request):
        if request.method == 'POST':
            return Response("post方法。。。")
    return Response("Hello, world!")

    DRF提供了一组可以加到视图函数上的装饰器来重写一些默认设置。这些装饰器必须放在@api_view()装饰器的下面。比如,要创建一个使用限制器确保特定用户每天只能调用一次的视图,可以用 @throttle_classes 装饰器并给它传递一个限制器类的列表。

    from rest_framework.response import Response
    from rest_framework.decorators import api_view, throttle_classes
    from rest_framework.throttling import UserRateThrottle
    
    
    class OncePerDayUserThrottle(UserRateThrottle):
        rate = '1/day'
    
        @api_view(['GET'])
        @throttle_classes([OncePerDayUserThrottle])
        def view(request):
            return Response("Hello")

    这些装饰器和前文中的 APIView 的子类中设置的属性相对应。

    可用的装饰器有:

    • @renderer_classes(...)
    • @parser_classes(...)
    • @authentication_classes(...)
    • @throttle_classes(...)
    • @permission_classes(...)

    这些装饰器都只接受一个参数,这个参数必须是类的列表或元组。

    GenericAPIView

    DRF通过多父类继承的方式,实现了各个不同的功能类。父类主要有两种,一种是mixin,一个是GenericAPIView。

    属性

    • queryset  - 必须指定!用于从视图返回对象的查询结果集。通常,你必须设置此属性或者重写  get_queryset()  方法。如果你重写了一个视图的方法,你应该调用get_queryset()  方法而不是直接访问该属性,因为  queryset  将被计算一次,这些结果将为后续请求缓存起来。
    • serializer_class  - 用于验证和反序列化输入以及用于序列化输出的Serializer类。 通常,你必须设置此属性或者重写 get_serializer_class()  方法。
    • lookup_field  - 用于执行各个model实例的对象查找的model字段。默认为  'pk' 。 请注意,在使用超链接API时,如果需要使用自定义的值,你需要确保在API视图和序列化类中都设置查找字段。
    • pagination_class  - 使用的分页类。默认值为 DEFAULT_PAGINATION_CLASS  设置的值,即  'rest_framework.pagination.PageNumberPagination' 。
    • filter_backends  - 用于过滤查询集的过滤器后端类的列表。默认值为DEFAULT_FILTER_BACKENDS  设置的值。
    • lookup_url_kwarg  - 应用于对象查找的URL关键字参数。它的 URL conf 应该包括一个与这个值相对应的关键字参数。如果取消设置,默认情况下使用与  lookup_field 相同的值。
    class PostDetail(mixins.RetrieveModelMixin,
            mixins.UpdateModelMixin,
            mixins.DestroyModelMixin,
            generics.GenericAPIView):
    queryset
    = Post.objects.all() serializer_class = PostSerializer lookup_url_kwarg = 'sn'    # 看这里 def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs)     #urls.py path('posts/<int:sn>/', views.PostDetail.as_view()),  # 注意其中的参数名

    方法

    get_queryset(self)

    返回list视图中使用的查询集,该查询集还用作detail视图中的查找基础。默认返回由  queryset  属性指定的查询集。 平时我们应该多使用这个方法,而不是直接访问(self.queryset  ,因为  self.queryset  只会被提交一次(Django的ORM的缓存特性),然后这些结果将为后续的请求缓存起来。 该方法可能会被重写以提供动态行为。

    get_object(self)

    返回用于detail视图的对象实例。默认使用  lookup_field  参数过滤基本的查询集。该方法可以被重写以提供更复杂的行为,例如基于多个 URL 参数的对象查找。

    get_serializer_class(self)

    选择你想要使用的序列化类。默认返回  serializer_class  属性的值。

    可以被重写以提供动态的行为,例如对于读取和写入操作使用不同的序列化器,或者为不同类型的用户提供不同的序列化器。

    Mixins

    Mixin 类用于提供视图的基本操作行为。注意mixin类提供动作方法,而不是直接定义处理程序方法,例如  .get()  和  .post() , 这允许更灵活的自定义。

    Mixin 类可以从  rest_framework.mixins 导入。

    下面我们看一下具体的mixin类:

    ListModelMixin

    提供一个  .list(request, *args, **kwargs)  方法,返回查询结果的列表。

    如果查询集被填充了数据,则返回  200 OK  响应,将查询集的序列化表示作为响应的主体。相应数据可以任意分页。

    CreateModelMixin

    提供  .create(request, *args, **kwargs)  方法,实现创建和保存一个新model实例的功能。

    如果创建了一个对象,这将返回一个  201 Created  响应,将该对象的序列化表示作为响应的主体。如果序列化的表示中包含名为  url 的键,则响应的  Location  头将填充该值。

    如果为创建对象提供的请求数据无效,将返回  400 Bad Request ,其中错误详细信息作为响应的正文。

    RetrieveModelMixin

    提供一个  .retrieve(request, *args, **kwargs)  方法,返回响应中现有模型的实例。

    如果可以检索对象,则返回  200 OK  响应,将该对象的序列化表示作为响应的主体。否则将返回  404 Not Found 。

    UpdateModelMixin

    提供  .update(request, *args, **kwargs)  方法,实现更新和保存现有模型实例的功能。

    同时还提供了一个  .partial_update(request, *args, **kwargs)  方法,这个方法和  update  方法类似,但更新的所有字段都是可选的。这允许支持 HTTP  PATCH  请求。

    如果一个对象被更新,这将返回一个  200 OK  响应,并将对象的序列化表示作为响应的主体。如果为更新对象提供的请求数据无效,将返回一个  400 Bad Request  响应,错误详细信息作为响应的正文

    DestroyModelMixin

    提供一个  .destroy(request, *args, **kwargs)  方法,实现删除现有模型实例的功能。如果成功删除对象,则返回  204 No Content  响应,否则返回  404 Not Found 。

    通用类视图

    以下类是具体的通用视图,也是我们平时真正使用的类,除非你需要深度定制,否则不要直接使用上面的父类。这些视图类可以从  rest_framework.generics 导入。

    • CreateAPIView:仅用于创建功能的视图。提供 post  方法。
    • ListAPIView:以只读的方式列出某些查询对象的集合。提供  get  方法。
    • RetrieveAPIView:以只读的形式获取某个对象。提供  get  方法。
    • DestroyAPIView:删除单个模型实例。提供 delete  方法。
    • UpdateAPIView:更新单个模型实例。提供  put 和 patch 方法。
    • ListCreateAPIView:创建或者列出模型实例的集合。提供  get  和  post  方法。同时继承了ListModelMixin和CreateModelMixin两个mixin类,以及基类 GenericAPIView。
    • RetrieveUpdateAPIView:读取或更新单个模型实例。提供  get ,  put  和  patch  方法的占坑。
    • RetrieveDestroyAPIView:读取或删除单个模型实例。提供  get  和  delete  方法。
    • RetrieveUpdateDestroyAPIView:读写删除单个模型实例。提供  get ,  put ,  patch  和  delete 方法。
  • 相关阅读:
    iOS Xcode制作模板类
    图片变形的抗锯齿处理方法
    iOS 9 分屏多任务:入门(中文版)
    iOS应用国际化教程(2014版)
    GitHub Top 100 简介
    iOS @synthesize var = _var 变量前置下划线解释
    @synthesize obj=_obj的意义详解 @property和@synthesize
    git 教程(14)--解决冲突
    git 教程(13)--创建与合并分支
    C++基础知识(3)---new 和 delete
  • 原文地址:https://www.cnblogs.com/zouzou-busy/p/12076629.html
Copyright © 2020-2023  润新知