Django:自定义序列化选项?
我正在开发一个基于Django的网络服务,现在想弄清楚最好的序列化方法是什么。
不过,有个比较棘手的要求,就是我希望能完全控制响应的格式和包含的字段。
举个例子,Django的序列化工具(不幸的是,包括了wadofstuff序列化器)会自动把字段包裹在{ model: "app.Model", pk: 42, fields: { ... }}
这样的格式里,这对于创建数据样本很有用,但对我来说就不太合适——我想要完全控制输出的内容。
另外,我希望这个序列化器能理解Django的对象,比如说,它能正确处理QuerySet
或者ManyToManyField
。
目前我在考虑使用django-piston的emitters.py,不过我对django-piston的使用体验一般,所以想看看有没有其他的选择。
那么,还有没有其他可以自定义的Django序列化器呢?
ª: 它的文档和测试都很少,我在使用序列化器时遇到了一些问题。
3 个回答
编辑:
现在可以在这里找到:https://bitbucket.org/sebpiq/any2any/
我目前正在为Django写一个功能齐全的序列化框架。这个框架的目标就是让你能完全控制序列化的过程。它可能会很好地满足你的需求!不过,它还没有准备好。我估计在一到两周内,我就能发布第一个版本。
你仍然可以查看谷歌代码:http://code.google.com/p/django-serializable/,如果你感兴趣的话,也可以提供一些帮助。
第一个版本发布时会有特别的下载链接!
你有没有听说过django-piston?它应该有很多工具可以让这个过程变得简单一些。
(我不太确定它在数据序列化方面的具体功能,但它可以帮助你创建Django的REST风格的网络服务。)
当我需要快速进行一些自定义的数据格式转换,而我的情况不需要把数据还原时,我通常会写一个 Django 模板,这样就可以从列表、查询集或对象中生成我想要的任何格式。然后你只需要用合适的上下文调用 render_to_string,就能得到序列化的数据。
更新:这里有个简单的例子
假设你想要获取一个符合 datatables.net 插件 接受的 JSON 格式。由于需要一些特殊参数,使用 simplejson 或其他工具来序列化查询集在这里是不可能的(或者至少不太简单)。我们发现提供这种结构的最快方法是创建一个简单的模板,像这样:
{
"sEcho": {{sEcho}},
"iTotalRecords": {{iTotalRecords}},
"iTotalDisplayRecords": {{iTotalDisplayRecords}},
"aaData":[
{% for obj in querySet %}
[
"{{obj.name}}",
"{{obj.message|truncatewords:20}}",
"<a href=\"{% url some_view obj.id %}\">{{obj.name}}</a>"
]
{% if not forloop.last %}
,
{% endif %}
{% endfor %}
]
}
这个模板可以生成我们想要的漂亮的 JSON 格式。它让你完全控制输出格式。另一个好处是可以通过使用内置的 Django 过滤器来修改对象的字段,这在我们的情况下非常有用。
我知道这不是书中描述的序列化方式,但如果你想把某个对象转换成自定义格式,这个方法可能是最快的。出于某种原因,Django 开发者允许将模板渲染成任何格式,而不仅仅是 HTML,那为什么不利用这个呢?
上面的例子非常具体,但你可以生成任何其他格式。当然,编写反序列化器来从这种格式恢复对象可能会很麻烦,但如果你不需要这个……