You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DRF使用paginate_queryset分页仅返回键,需保留键值对结构

解决DRF PageNumberPagination分页字典仅返回键的问题

问题根源

DRF的分页类默认处理可迭代序列(如QuerySet、列表),而Python字典的默认迭代器只会遍历键——你之前转成元组如果用的是tuple(your_dict),本质是把键转成了元组;即便用dict.items()转成元组列表,默认返回的也是元组结构,而非完整键值对字典,所以前端只能看到部分内容。

简便解决办法

方法1:将字典转换为键值对字典列表(最直接)

在视图中把原字典转换成包含键值对的结构化列表,分页类会直接处理这个列表,保留完整结构:

# 视图中的处理逻辑
def list(self, request, *args, **kwargs):
    # 原键值对数据
    original_data = {"user1": "Alice", "user2": "Bob", "user3": "Charlie"}
    # 转换为键值对字典列表
    formatted_data = [{"key": k, "value": v} for k, v in original_data.items()]
    
    # 执行分页
    page = self.paginate_queryset(formatted_data)
    if page is not None:
        return self.get_paginated_response(page)
    return Response(formatted_data)

这种方式不需要修改自定义分页类,直接调整输入数据结构即可,分页后返回的results会是完整的键值对字典。

方法2:重写自定义分页类的响应格式化方法

如果不想修改输入数据结构,可以在自定义分页类中重写get_paginated_response,把分页后的元组结果转换成键值对:

from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response

class CustomPagePagination(PageNumberPagination):
    page_size = 10  # 你的分页配置

    def get_paginated_response(self, data):
        # 将(key, value)元组转换为键值对字典
        formatted_results = [{"key": item[0], "value": item[1]} for item in data]
        return Response({
            'count': self.page.paginator.count,
            'next': self.get_next_link(),
            'previous': self.get_previous_link(),
            'results': formatted_results
        })

然后在视图中传入dict.items()的列表:

def list(self, request, *args, **kwargs):
    original_data = {"user1": "Alice", "user2": "Bob"}
    # 传入键值对元组列表
    page = self.paginate_queryset(list(original_data.items()))
    if page is not None:
        return self.get_paginated_response(page)
    return Response(dict(original_data.items()))

方法3:利用DRF序列化器处理结构

如果你的数据需要更复杂的序列化,可以定义一个简单的序列化器来处理键值对:

from rest_framework import serializers

class KeyValueSerializer(serializers.Serializer):
    key = serializers.CharField()
    value = serializers.CharField()  # 根据你的数据类型调整字段类型

然后在视图中使用序列化器格式化分页后的结果:

def list(self, request, *args, **kwargs):
    original_data = {"user1": "Alice", "user2": "Bob"}
    queryset = list(original_data.items())
    page = self.paginate_queryset(queryset)
    
    if page is not None:
        serializer = KeyValueSerializer(page, many=True)
        return self.get_paginated_response(serializer.data)
    
    serializer = KeyValueSerializer(queryset, many=True)
    return Response(serializer.data)

内容的提问来源于stack exchange,提问作者Stephen Milic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:22:39