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
相关产品推荐
相关产品推荐

