返回序列化的django对象中的计算字段?

时间:2010-11-01 17:48:30

标签: serialization django-models

我正在使用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中。

2 个答案:

答案 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')

这可能比必要的更冗长,但我认为这样更清楚。

这仍然感觉有点不满意,但似乎工作得很好。