当前位置: 首页 > 面试题库 >

如何在非通用视图/视图集中使用分页?

司寇嘉茂
2023-03-14
问题内容

我已经在SO文档中编写了一个示例,以统一上述问题的答案,但是由于文档将于2017年8月8日关闭,因此,我将遵循这一广受好评和讨论的元答案的建议,并将我的示例转换为自我回答发布。

当然,我也很高兴看到任何其他方法!!

题:

我想APIView在Django Rest Framework项目上使用非通用视图/视图集(例如:)。
当我阅读分页文档时:

仅在使用通用视图或视图集时才自动执行分页。如果您使用的是常规APIView,则需要自己调用分页API,以确保您返回分页响应。有关示例,请参见mixins.ListModelMixingenerics.GenericAPIView类的源代码。

我仍然可以继续使用非通用视图/视图集吗?
如何在其上执行分页?


问题答案:

我们可以找到解决方案而无需重新发明轮子:

  1. 让我们看一下如何实现generics分页: django-rest-framework / rest_framework / generics.py。
    这也正是我们将要使用的观点!

  2. 假设我们有一个全局分页设置,如下所示
    settings.py

    REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 
        'rest_framework.pagination.DESIRED_PAGINATION_STYLE',
    'PAGE_SIZE': 100
    

    }

  3. 为了不使视图/视图集的代码膨胀,我们可以创建一个自定义的mixin来存储我们的分页代码:

    class MyPaginationMixin(object):
    
    @property
    def paginator(self):
        """
        The paginator instance associated with the view, or `None`.
        """
         if not hasattr(self, '_paginator'):
             if self.pagination_class is None:
                 self._paginator = None
             else:
                 self._paginator = self.pagination_class()
         return self._paginator
    
     def paginate_queryset(self, queryset):
         """
         Return a single page of results, or `None` if pagination 
         is disabled.
         """
         if self.paginator is None:
             return None
         return self.paginator.paginate_queryset(
             queryset, self.request, view=self)
    
     def get_paginated_response(self, data):
         """
         Return a paginated style `Response` object for the given 
         output data.
         """
         assert self.paginator is not None
         return self.paginator.get_paginated_response(data)
    
  4. 然后views.py

    from rest_framework.settings import api_settings
    

    from rest_framework.views import APIView

    from my_app.mixins import MyPaginationMixin

    class MyView(APIView, MyPaginationMixin):
    queryset = OurModel.objects.all()
    serializer_class = OurModelSerializer
    pagination_class = api_settings.DEFAULT_PAGINATION_CLASS

    # We need to override the get method to insert pagination
    def get(self, request):
        ...
        page = self.paginate_queryset(self.queryset)
        if page is not None:
            serializer = self.serializer_class(page, many=True)
            return self.get_paginated_response(serializer.data)
    

现在我们有了APIView分页。



 类似资料:
  • 主要内容:静态网页,从数据库列表和显示数据在某些情况下编写视图代码,正如我们所看到前面工作真的很繁重。想象一下,只需要一个静态页面或列表页。 Django还提供了一种简单的方法来设置这些简单的视图被称为通用视图。 不同于传统的视图,一般的视图是一个类但没有函数。Django还提供了一组类 django.views.generic 通用视图,以及每一个普通视图是这些类或从它们中的一个类继承的。 有10+泛型类− 你可以使用通用视图。让我们来

  • 通用视图 基于类的视图的一个主要优点是它们允许你编写可重复使用的行为。 REST framework 通过提供大量预构建视图来提供常用模式,从而充分利用了这一点。 REST framework 提供的通用视图允许您快速构建紧密映射到数据库模型的 API 视图。 如果通用视图不符合需求,可以使用常规的 APIView 类,或者利用 mixin 特性和基类组合出可重用的视图。 举个栗子 通常,在使用通

  • 我有一个这样的视图集来列出用户的数据: 我想打开分页,就像模型视图集的默认分页一样: 官方文档说: 只有在使用通用视图或视图集时,分页才会自动执行 …但我的结果集根本没有分页。如何为其分页?

  • 数据库将数据存储在数据表中,有些时候,为了展现某些数据,还需要跨越多个表进行计算。比如你有两个数据表 雇员表 t_employee 任务表 t_task 每个雇员都会有多个任务,所以任务表有一个字段 eid 指向雇员的主键 id。 我们需要随时知道一个雇员有多少个任务,所以在雇员的的 POJO 里面,有一个 Java 字段叫做 taskCount 来描述雇员当前总的任务数量。 那么,如何获取这个

  • 如果利用视图来简化执行SQL语句某些操作。 视图 视图是虚拟表,只是在使用时动态检索数据查询。 为什么使用视图函数 重用SQL语句 简化复杂的SQL操作,方便重用 使用表的组成部分而不是全部 包含数据,可以给用于提高表的特定访问权限,而不是整个。 更改数据格式和表示,当需要返回跟底层表的表示格式不同的数据。 创建视图函数后,可以用与表相同的方式利用他们,可以进行SELECT执行操作,过滤,排序数据

  • 我注意到XCode中的UI组件:。 根据提供的描述,我想利用它在几个不同的屏幕上显示我的应用程序的可重用组件。我一直在网上寻找一个基本的教程或一些留档,但我没有找到任何有用的东西。 请问有人能建议如何把这个连接起来并利用它吗?目前,容器视图似乎没有调整大小,这是有问题的。关于如何启用此功能的任何提示也将不胜感激。 干杯