如何使用 Django Rest 过滤器限制查询结果

Posted

技术标签:

【中文标题】如何使用 Django Rest 过滤器限制查询结果【英文标题】:How to limit query results with Django Rest filters 【发布时间】: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 个。

【问题讨论】:

【参考方案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 选项

【讨论】:

以上是关于如何使用 Django Rest 过滤器限制查询结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django rest 框架从 GET 请求的查询参数中过滤多个 id?

如何使用 Django Rest Framework 过滤器将过滤器链接在一起

带有视图集路由器查询集过滤器的 Django REST 框架

django-rest-framework 按日期过滤=无

在带有 django-rest-framework 的过滤器中使用自定义方法

Django - 如何使用 Django Rest Framework 按日期过滤?