我是Django REST Framework的新手,我遇到了一个问题。
我正在为社交应用构建后端。任务是返回一个分页的JSON响应给客户端。在文档中我只发现了如何为模型实例做到这一点,但我所拥有的是一个列表:
[368625, 507694, 687854, 765213, 778491, 1004752, 1024781, 1303354, 1311339, 1407238, 1506842, 1530012, 1797981, 2113318, 2179297, 2312363, 2361973, 2610241, 3005224, 3252169, 3291575, 3333882, 3486264, 3860625, 3964299, 3968863, 4299124, 4907284, 4941503, 5120504, 5210060, 5292840, 5460981, 5622576, 5746708, 5757967, 5968243, 6025451, 6040799, 6267952, 6282564, 6603517, 7271663, 7288106, 7486229, 7600623, 7981711, 8106982, 8460028, 10471602]
有一些不错的方法吗?我是否必须以某种特殊方式对其进行序列化?
客户正在等待的是:
{"users": [{"id": "368625"}, {"id": "507694"}, ...]}
问题是:如何对此类回复进行分页?
任何输入都非常感谢!
祝你好运, 阿列克谢。
答案 0 :(得分:3)
TLDR:
import json
data=[368625, 507694, 687854, 765213, 778491, 1004752, 1024781, 1303354, 1311339, 1407238, 1506842, 1530012, 1797981, 2113318, 2179297, 2312363, 2361973, 2610241, 3005224, 3252169, 3291575, 3333882, 3486264, 3860625, 3964299, 3968863, 4299124, 4907284, 4941503, 5120504, 5210060, 5292840, 5460981, 5622576, 5746708, 5757967, 5968243, 6025451, 6040799, 6267952, 6282564, 6603517, 7271663, 7288106, 7486229, 7600623, 7981711, 8106982, 8460028, 10471602]
print(json.dumps({"users":[{"id":value} for value in data]}))
import json
导入json包,这是一个JSON序列化/反序列化库
json.dumps(obj)
获取obj
,一个python对象,并将其序列化为JSON字符串
[{"id":value} for value in data]
只是一个列表解析,它创建了一个python词典列表,"id"
映射到data
数组中的每个值
编辑:分页 我不确定是否有一些关于分页的标准,但一个简单的模型将是:
"data": {
"prevPage": "id",
"nextPage": "id",
"data": [
...
]
}
老实说,在python中实现它并不会那么难:
data=[ ... ]
currentPage={"pageID":0,"data":[]}
prevPage={"pageID":-1}
pageSize=5
for value in data:
currentPage["data"].append({"id":value})
if len(currentPage)==pageSize:
currentPage["prevPage"]=prevPage["pageID"]
prevPage["nextPage"]=currentPage["pageID"]
# add currentPage to some database of pages
prevPage=currentPage
currentPage={"pageID":"generate new page id","data":[]}
显然,这不是很精致,但显示了基本概念。
编辑:不存储页面的分页
您当然可以在每次请求时重新创建页面:
def getPage(pageNum)
#calculate pageStart and pageEnd based on your own requiremnets
pageStart = (pageNum // 5) * 5
pageEnd = (pageNum // 5)*5+5
return [{"id":data[idx] for idx in range(pageStart, pageEnd)}]