zoukankan      html  css  js  c++  java
  • GenericAPIView

    GenericAPIView

    此类扩展了REST框架的APIView类,为标准列表和详细信息视图添加了常用的行为。
    提供的每个具体通用视图都是通过将GenericAPIView与一个或多个mixin类组合而构建的。
    

    属性

    **基本设置:**
    以下属性控制基本视图行为。
    
    - queryset - 应该用于从此视图返回对象的查询集.  通常,您必须设置此属性,或覆盖get_queryset()方法。如果要覆盖视图方法,则必须调用get_queryset()而不是直接访问此属性,因为queryset将被评估一次,并且将为所有后续请求缓存这些结果。
    - serializer_class - 应该用于验证和反序列化输入以及序列化输出的序列化程序类。 通常,您必须设置此属性,或覆盖get_serializer_class()方法。
    - lookup_field - 应该用于执行单个模型实例的对象查找的模型字段。 默认为'pk'。 请注意,使用超链接API时,如果需要使用自定义值,则需要确保API视图和序列化程序类都设置查找字段。
    - lookup_url_kwarg - 应该用于对象查找的URL关键字参数。 URL conf应包含与此值对应的关键字参数。 如果未设置,则默认使用与lookup_field相同的值。
    
    **分页:**
     与列表视图一起使用时,以下属性用于控制分页。
    
    - pagination_clas - 分页列表结果时应使用的分页类。 默认为与DEFAULT_PAGINATION_CLASS设置相同的值,即'rest_framework.pagination.PageNumberPagination'。 设置pagination_class = None将禁用此视图上的分页。
    
    **过滤:**
    
    - filter_backends - 应该用于过滤查询集的过滤器后端类列表。默认值与DEFAULT_FILTER_BACKENDS设置的值相同。
    

    类方法

    [get_queryset(self)]

    返回应该用于列表视图的查询集,该查询集应该用作详细视图中查找的基础。默认返回queryset属性指定的查询集。
    应始终使用此方法而不是直接访问self.queryset,因为self.queryset仅被评估一次,并且这些结果将被缓存用于所有后续请求。
    
    可以重写以提供动态行为,例如返回查询集,该查询集特定于发出请求的用户。
    
    ```
        def get_queryset(self):
            assert self.queryset is not None, (
            "'%s' should either include a `queryset` attribute, "
            "or override the `get_queryset()` method."
            % self.__class__.__name__
            )
    
            queryset = self.queryset
            if isinstance(queryset, QuerySet):
                # Ensure queryset is re-evaluated on each request.
                queryset = queryset.all()
            return queryset
    
    ```
    

    [get_object(self)]

    返回应该用于详细视图的对象实例。 默认使用lookup_field参数来过滤基本查询集。
    
    可以重写以提供更复杂的行为,例如基于多个URL kwarg的对象查找。
    
    ```
    def get_object(self):
        queryset = self.filter_queryset(self.get_queryset())
    
            # Perform the lookup filtering.
            lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
            filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
            obj = get_object_or_404(queryset, **filter_kwargs)
    
            # May raise a permission denied
            self.check_object_permissions(self.request, obj)
    
            return obj
            
    ```
    
    请注意,如果您的API不包含任何对象级别权限,您可以选择性地排除self.check_object_permissions,并简单地从get_object_or_404查找返回该对象。
    

    [filter_queryset(self, queryset)]

    给定一个查询集,使用正在使用的任何过滤后端过滤它,返回一个新的查询集。
    例如:
    
    ```
    def filter_queryset(self, queryset):
    	filter_backends = (CategoryFilter,)
    
    	if 'geo_route' in self.request.query_params:
    		filter_backends = (GeoRouteFilter, CategoryFilter)
    	elif 'geo_point' in self.request.query_params:
    		filter_backends = (GeoPointFilter, CategoryFilter)
    
    	for backend in list(filter_backends):
    		queryset = backend().filter_queryset(self.request, queryset, view=self)
    
    	return queryset
    ```
    

    [get_serializer_class(self)]

    返回应该用于序列化程序的类。 默认返回serializer_class属性。	可以重写以提供动态行为,例如使用不同的序列化程序进行读写操作,
        或者为不同类型的用户提供不同的序列化程序。
    
        def get_serializer_class(self):
            return self.serializer_class
    

    子类处理增删改查

    class ListAPIView(mixins.ListModelMixin,
                  GenericAPIView):
    
    class RetrieveAPIView(mixins.RetrieveModelMixin,
                      GenericAPIView):
    
    class DestroyAPIView(mixins.DestroyModelMixin,
                     GenericAPIView):
    
    class UpdateAPIView(mixins.UpdateModelMixin,
                    GenericAPIView):
    

    class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,
                                   mixins.UpdateModelMixin,
                                   mixins.DestroyModelMixin,
                                   GenericAPIView):
        
        #Concrete view for retrieving, updating or deleting a model instance.
        
        def get(self, request, *args, **kwargs):
            return self.retrieve(request, *args, **kwargs)
    
        def put(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        def patch(self, request, *args, **kwargs):
            return self.partial_update(request, *args, **kwargs)
    
        def delete(self, request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    noi 2011 noi嘉年华 动态规划
    最小乘积生成树
    noi 2009 二叉查找树 动态规划
    noi 2010 超级钢琴 划分树
    noi 2011 阿狸的打字机 AC自动机
    noi 2009 变换序列 贪心
    poj 3659 Cell Phone Network 动态规划
    noi 2010 航空管制 贪心
    IDEA14下配置SVN
    在SpringMVC框架下建立Web项目时web.xml到底该写些什么呢?
  • 原文地址:https://www.cnblogs.com/daviddd/p/11918959.html
Copyright © 2011-2022 走看看