如何使用 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 框架