我要在Django中建立JSON API的原型(最终实现将是诸如Civet之类的嵌入式产品),以便可以测试更高级别的应用程序。我需要保留以下形式的数据:
{
someListOfIds: [1, 2, 7, 9]
}
整数对硬件意味着某种意义-它们与数据库中的其他任何内容都不对应。
我正在使用Django 2.1.5和Python 3.5.2。在我的模型中,someListOfIds
当前定义为CharField,因此该值存储为字符串"[1, 2, 7, 9]"
。当我从视图中的数据库检索行时,我将该字段通过.decode
的{{1}}方法传递,这似乎将其转换为整数列表。然而,尝试传送它以这样的形式在json.decoder.JSONDecoder()
结果在它在绳指明分数形式被返回:
JsonResponse
注意:根据here的建议,我目前拥有以下视图代码,仅返回{
someListOfIds: "[1, 2, 7, 9]"
}
属性的内容,而丢弃多余的fields
和pk
属性否则将包括在内:
model
据我所知,是对python对象的序列化,重新引入了string-y-ness。
cfgs = [Configuration.deStringify(x) for x in Configuration.objects.all()]
objs = serializers.serialize('python', cfgs)
cfgs = [d['fields'] for d in objs]
response = { "configurations": cfgs }
return JsonResponse(response)
是:
deStringify
这是一段很简单的代码-它只需要一段时间来提供正确结构化的数据。我一直在寻找一个可行的解决方案,而无需重新开始并添加专用的REST框架。
答案 0 :(得分:0)
虽然没有描述精确的场景,但是文档中的this hint让我怀疑我从整数包含字符串列表到实际整数列表的转换是serializers.serialize(...)
随后读取该属性时被撤消。现在,我从python序列化结构中提取了fields
属性后执行了转换,并且我的JsonResponse现在正确包含了所需的int列表。
这似乎是一项艰巨的工作,可能反映出我没有“了解” Django的工作方式,虽然它虽然不漂亮,但却可以完成工作:
decoder=json.decoder.JSONDecoder()
all = Configuration.objects.all()
objs = serializers.serialize('python', all)
# Extract the interesting part of the structure
cfgs = [d['fields'] for d in objs]
for key in ['someListOfIds', 'someOtherListOfInts', 'finalListOfInts']:
[cfg.update({key: decoder.decode(cfg[key])}) for cfg in cfgs]
response = { "configurations": cfgs }
return JsonResponse(response)