【问题标题】:How to limit query results with Django Rest filters如何使用 Django Rest 过滤器限制查询结果
【发布时间】:2016-02-03 21:19:04
【问题描述】:

我正在开发一个使用 Django Rest Framework 构建的 api。我已经定义了几个model 类,并且我还创建了一些过滤器来应用在指定的api-endpoints 中发生的某些查询。

我正在尝试在queryset 中应用 LIMIT,但我不希望 使用 Django 表示法 e.x. Entry.objects.all()[:5]。相反,我希望能够从与模型关联的过滤器内部应用限制。

到目前为止,我还没有找到任何解决方案。我在想我应该找到一种方法来定义一个具有默认值的过滤器,这会导致不限制查询集,如果请求到达端点并包含类似?filter=10 的内容,那么查询集应该限制为前 10 个。

【问题讨论】:

    标签: python django django-rest-framework django-filter


    【解决方案1】:

    您可以使用 Django Rest Framework 分页。 pagination_class LimitOffsetPagination 使您能够限制 query_param 中返回的条目数。

    http://www.django-rest-framework.org/api-guide/pagination/

    【讨论】:

    • 这确实非常接近我的需要!虽然在这种情况下我想覆盖LimitOffsetPagination 类并为参数offset 提供一个默认值(可能为0),以便用户只需要指定limit 参数。我正在考虑使用PageNumberPagination 并覆盖page_size_query_param 参数以获得默认值limit。这听起来合理吗?
    • 是的,这是一个很好的解决方案。如文档中所述,参数page_size_query_param 可用于允许客户端控制请求页面大小。在PageNumberPagination 中,此参数默认设置为无。
    • 这听起来可能很傻,但我不知道在哪里放置自定义分页类。
    • 你有两个选择。您可以在 REST_FRAMEWORK 设置字典中的设置 DEFAULT_PAGINATION_CLASS 中指定默认分页类。每个视图使用类属性 pagination_class 并指定您的子类。
    • 但是分页类代码应该放在哪里呢? (我指的是第一选择)
    【解决方案2】:

    您可以扩展或自定义drf 中可用的分页类

      class UserSpecificPagination(LimitOffsetPagination):
          def get_limit(self, request):
              if logic_met(request.user):
                self.max_limit = custom_limit
          return super(UserSpecificPagination, self).get_limit(request)
    

    ListAPIView 或DRF 设置中将类设置为pagination_class

    【讨论】:

      【解决方案3】:

      ListApiView 覆盖finalize_response 函数。我没有找到任何其他内置方法或参数来设置响应数据的限制。

      from rest_framework.generics import ListAPIView
      
      class BoolQSearch(ListAPIView):
          queryset = Model1.objects.all()
          serializer_class = Model1Serializer
      
          def finalize_response(self, request, response, *args, **kwargs):
              response.data = response.data[:5]
              return super().finalize_response(request, response, *args, **kwargs)
      

      【讨论】:

      • 谢谢!当您不想使用分页(例如自动完成端点)时,这是一个很好的解决方案。我添加了if response.status_code == 200: 以避免错误(在我的情况下,django-filters 需要一个过滤器)
      【解决方案4】:

      你应该使用 django-rest 的分页 api

      http://www.django-rest-framework.org/api-guide/pagination/

      查看limit 选项

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-29
        • 2016-08-13
        • 2011-09-28
        • 1970-01-01
        • 1970-01-01
        • 2017-02-08
        • 2021-11-10
        • 2021-03-26
        相关资源
        最近更新 更多