Python Django Rest框架按指定的GET参数分页
我正在使用Django REST框架,需要根据请求提供的GET参数对列表进行分页 我知道我可以在设置中设置Python Django Rest框架按指定的GET参数分页,python,django,pagination,django-rest-framework,Python,Django,Pagination,Django Rest Framework,我正在使用Django REST框架,需要根据请求提供的GET参数对列表进行分页 我知道我可以在设置中设置'PAGINATE_BY':10,但是我希望允许调用者在发出请求时指定他们要分页的号码 我目前拥有以下序列化程序: from api.models import Countries from rest_framework import serializers class CountrySerializer(serializers.Serializer): country_geona
'PAGINATE_BY':10
,但是我希望允许调用者在发出请求时指定他们要分页的号码
我目前拥有以下序列化程序:
from api.models import Countries
from rest_framework import serializers
class CountrySerializer(serializers.Serializer):
country_geoname_id = serializers.CharField(required=True)
country_code = serializers.CharField(source="iso", max_length=2L, required=True)
country_name = serializers.CharField(max_length=64L, required=True)
def transform_iso(self, obj, value):
return "country_code"
我尝试了以下观点:
@api_view(['GET'])
def country_list(request):
"""
List all countries
"""
if request.method == 'GET':
queryset = Countries.objects.all()
serializer = CountrySerializer(queryset, many=True, data=request.DATA)
paginate_by = request.GET.get('limit', 10)
return Response(serializer.data)
然而,我觉得我遗漏了一些东西,我无法从文档中找出它
我应该在序列化程序中还是在视图中进行分页
提前感谢。请尝试
按参数分页设置。这段代码应该可以让您非常接近:
class CountryListView(ListAPIView):
model = Countries
serializer_class = CountrySerializer
paginate_by_param = 'limit'
看
我的代码片段使用通用视图来消除大量重复,我建议也看看这些视图 让我们来分析一下这个问题:
您需要创建分页方法,允许用户定义页面大小:
如DRF文档中所述,您可以通过覆盖页面大小查询参数来定义参数名
:
如果已设置,则这是一个字符串值,指示允许客户端根据每个请求设置页面大小的查询参数的名称。默认值为None
,表示客户端可能无法控制请求的页面大小
您可以通过以下方式之一实现这一点:
- 在
settings.py
中添加以下内容:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
'PAGINATE_BY_PARAM': 'page_size'
}
- 或者,您可以创建自定义分页类并覆盖其中的设置:
from rest_framework.pagination import PageNumberPagination
class MyPagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
最后,您需要定义将在视图函数中使用的分页类
以下示例仅通过将paginator
变量的值更改为PageNumberPaginator
或MyPaginator
即可用于上述任一情况:
现在,您有了基于函数的分页视图和一个用于更改页面大小的查询参数。您阅读了吗?它清楚地解释了如何对数据进行分页。上面的链接已断开。这里是同一页:嘿@MarkWinterbottom我添加了一个迟来的(只有4年)答案。好好看看!是否有任何方法可以从MyPagination
类本身检索page_size
值,并在超出限制时返回错误?我问这个问题是因为我不想在每个视图
或视图集
@上验证它,谢谢!是如果您正在创建MyPagination
类的实例,则可以通过点表示法检索属性值:MyPagination\u实例。page\u size
。
from rest_framework.pagination import PageNumberPagination
@api_view(['GET'])
def country_list(request):
"""
List all countries
"""
if request.method == 'GET':
paginator = PageNumberPagination()
queryset = Countries.objects.all()
context = paginator.paginate_queryset(queryset, request)
serializer = CountrySerializer(context, many=True)
return paginator.get_paginated_response(serializer.data)