Django:自定义序列化选项?

4 投票
3 回答
2694 浏览
提问于 2025-04-16 00:03

我正在开发一个基于Django的网络服务,现在想弄清楚最好的序列化方法是什么。

不过,有个比较棘手的要求,就是我希望能完全控制响应的格式和包含的字段。

举个例子,Django的序列化工具(不幸的是,包括了wadofstuff序列化器)会自动把字段包裹在{ model: "app.Model", pk: 42, fields: { ... }}这样的格式里,这对于创建数据样本很有用,但对我来说就不太合适——我想要完全控制输出的内容。

另外,我希望这个序列化器能理解Django的对象,比如说,它能正确处理QuerySet或者ManyToManyField

目前我在考虑使用django-piston的emitters.py,不过我对django-piston的使用体验一般,所以想看看有没有其他的选择。

那么,还有没有其他可以自定义的Django序列化器呢?

ª: 它的文档和测试都很少,我在使用序列化器时遇到了一些问题。

3 个回答

1

编辑:

现在可以在这里找到:https://bitbucket.org/sebpiq/any2any/


我目前正在为Django写一个功能齐全的序列化框架。这个框架的目标就是让你能完全控制序列化的过程。它可能会很好地满足你的需求!不过,它还没有准备好。我估计在一到两周内,我就能发布第一个版本。

你仍然可以查看谷歌代码:http://code.google.com/p/django-serializable/,如果你感兴趣的话,也可以提供一些帮助。

第一个版本发布时会有特别的下载链接!

1

你有没有听说过django-piston?它应该有很多工具可以让这个过程变得简单一些。

(我不太确定它在数据序列化方面的具体功能,但它可以帮助你创建Django的REST风格的网络服务。)

1

当我需要快速进行一些自定义的数据格式转换,而我的情况不需要把数据还原时,我通常会写一个 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,那为什么不利用这个呢?

上面的例子非常具体,但你可以生成任何其他格式。当然,编写反序列化器来从这种格式恢复对象可能会很麻烦,但如果你不需要这个……

撰写回答