我正在使用Django编写API,并且我遇到了一些关于返回数据的问题,这些数据没有直接存储在数据库中,或者在其他情况下以与数据库模式不同的方式组织。
特别是,给定一个特定的数据请求,我想在序列化并返回它之前向我的模型添加一个计算数据字段。但是,如果我只是将字段添加到模型中,内置的序列化程序(我使用json)会忽略它,大概是因为它从模型定义中获取字段列表。
我可以编写自己的序列化程序,但真是太痛苦了。或者我想我可以运行model_to_dict,然后序列化dict而不是模型。谁有更好的想法?
这就是代码现在模糊的样子:
squidlets = Squidlet.objects.filter(stuff)
for i in range(len(squidlets)):
squidlets[i].newfield = do_some_computation(squid)
return HttpResponse(json_serializer.serialize(squidlets,ensure_ascii=False),
'text/json')
但是newfield不在返回的json中。
答案 0 :(得分:0)
我认为你应该使用简单的json进行序列化..并且它不一定是一个查询集...要逃避它,因为json也使用marksafe
from django.utils.safestring import mark_safe
from django.utils import simplejson
simplejson.dumps(mark_safe(your_data_structure))
答案 1 :(得分:0)
我选择了dict解决方案,结果相当干净。
这是代码的样子:
from django.forms.models import model_to_dict
squiddicts = []
squidlets = Squidlet.objects.filter(stuff)
for i in range(len(squidlets)):
squiddict = model_to_dict(squidlets[i])
squiddict["newfield"] = do_some_computation(squidlets[i])
squiddicts.append(squiddict)
return HttpResponse(simplejson.dumps(squiddicts,ensure_ascii=False),
'text/json')
这可能比必要的更冗长,但我认为这样更清楚。
这仍然感觉有点不满意,但似乎工作得很好。