【问题标题】:Django: custom serialization options?Django:自定义序列化选项?
【发布时间】:2011-03-04 14:17:03
【问题描述】:

我正在开发一个基于 Django 的 Web 服务,我正在尝试找出进行序列化的最佳方式。

不过,棘手的要求是,我想对响应的格式和包含的字段进行几乎完全的控制。

例如,Django 序列化程序(不幸的是,包括wadofstuff serializer)自动将字段包装在{ model: "app.Model", pk: 42, fields: { ... }} 中,这对于创建固定装置非常有用,但对我来说不是很好——我想要完全控制输出。

此外,我想要一个能够识别 Django 对象的序列化程序,例如,它会使用 QuerySet 或 ManyToManyField 来做正确的事情。

目前我正在考虑使用 django-piston 的emitters.py,但我对 django-piston 的体验只是平庸ª,所以我想看看是否有其他选择。

那么,对于可定制的 Django 序列化程序,还有其他选择吗?

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

【问题讨论】:

  • 哦,是的:格式。我将对结果进行 AMF 编码并将其发送到 Flash 客户端,因此序列化程序应生成仅由原始类型(字典、数字、字符串等)组成的数据结构。

标签: python django serialization django-piston


【解决方案1】:

你看过 django-piston 吗?它应该有很多东西可以让这更容易。

(不确定具体的序列化,但 Django RESTy Web 服务。)

【讨论】:

  • 阅读问题的方式,djc ;) 是的,我看过 django-piston,它最终可能会使用它的序列化程序。我不确定我是否想使用整个东西,因为我有一些平庸的经验,我正在向 Flash 发送数据(PyAMF 做得更好)......但是,当然,这可能会改变:P
【解决方案2】:

当我需要一些非常快速的自定义序列化并且我的案例不需要反序列化时,我只需编写 django 模板,它可以从列表/查询集/对象中生成我想要的任何格式。然后,您可以使用适当的上下文调用 render_to_string 并序列化您的数据。

更新:一些简短的例子

假设您希望获得datatables.net plugin 接受的 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,那么为什么不使用它呢?

上面显示的示例非常具体,但您可以生成任何其他格式。当然,为此编写反序列化器可以从这种格式恢复对象可能会很痛苦,但如果你不需要它......

【讨论】:

  • ಠ_ಠ 这听起来像是止痛药。手动将数据转换为“基本”对象然后使用 json/whatever 来序列化它不是更容易吗?
  • 不,不是。您个人提到某些序列化程序根据其特定结构输出数据。我用它来生成一些很难以其他方式获得的 json 格式。当然,如果您知道如何编写序列化程序 - 那就去做吧:)
  • 好吧,好吧,也许我只是不够有创意。你介意举一个小例子来说明你的想法吗?例如,我想到了这样的事情:serialized = [ { "name": person.name, "friends": [ { "name": friend.name } for friend in person.friends.all() ] } for person in people ]; return simplejson.dumps(serialized);
  • 不要误会我的意思。我并不是说这里推荐我的棘手解决方案。不久前,当我遇到与您描述的类似要求时,我才发现它很有用。我用现实生活中的例子更新了我的帖子。希望这能让我的观点更清楚。
【解决方案3】:

编辑:

现在https://bitbucket.org/sebpiq/any2any/


我目前正在为 Django 编写一个功能齐全的序列化框架。目的恰恰是完全控制序列化。它可能会很好地满足您的要求!但是,它还没有准备好。我估计在 1 或 2 周内我就能发布第一个版本。

您仍然可以查看谷歌代码:http://code.google.com/p/django-serializable/,如果您有兴趣,甚至可以提供一些帮助。

第一个版本发布时会有特色下载!

【讨论】:

  • 太棒了!我已将 RSS 提要添加到我的阅读器中,我期待看到您发布的内容。
  • 你好大卫!这还没有准备好,因为我最近一直在忙其他事情,但你可以检查一下:它已经可以序列化/反序列化模型及其父母。唯一的问题是它还不是很稳定......
猜你喜欢
  • 2016-05-23
  • 2014-05-19
  • 1970-01-01
  • 2014-10-31
  • 2014-10-05
  • 1970-01-01
  • 2016-11-28
  • 2018-12-25
  • 1970-01-01
相关资源
最近更新 更多