Django中如何将查询返回的字符串结果转为原列表类型?
解决Django查询Celery任务结果时的格式转换问题
问题说明
你的Django后端中,DjangoCeleryResultsTaskresult模型的result列存储的是列表嵌套字典格式的数据,但通过values('result')查询后,得到的是JSON格式的字符串,无法直接作为Python列表使用。
方案一:将字符串转为列表嵌套字典
数据库里存的是JSON序列化后的字符串,直接用Python标准库的json模块解析即可:
import json # 提取出字符串内容 service_results_str = list(just_res)[0] # 解析为Python列表嵌套字典 service_results = json.loads(service_results_str)
执行后service_results就会恢复成你需要的列表格式。
方案二:直接查询获取原生Python类型
不要用values()方法,直接查询模型实例并访问result属性,Celery的结果模型会自动帮你完成反序列化:
# 获取单个任务结果实例 task_result = DjangoCeleryResultsTaskresult.objects.filter(task_id=taskname).first() if task_result: # 直接得到列表嵌套字典格式的结果 service_results = task_result.result
为什么values()返回字符串?
values()方法是直接从数据库读取原始存储值,不会触发模型字段的反序列化逻辑。Celery在存储任务结果时,会把Python对象序列化成JSON字符串存入数据库,所以values('result')拿到的就是这个原始字符串。而直接访问模型实例的result属性时,字段的内置逻辑会自动把字符串反序列化为对应的Python对象。
内容的提问来源于stack exchange,提问作者James Xu
相关产品推荐
相关产品推荐

