JSON 使用 simplejson 序列化 Django 模型

Posted

技术标签:

【中文标题】JSON 使用 simplejson 序列化 Django 模型【英文标题】:JSON Serializing Django Models with simplejson 【发布时间】:2011-01-16 00:39:07 【问题描述】:

我想使用 simplejson 序列化 Django 模型。 Django 的序列化程序不支持字典……而 simplejson 不支持 Django 查询集。这真是个难题。

在模型中,赞助商具有赞助商级别的外键,我试图将属于某个赞助商级别的所有赞助商分组在一起。下面是生成列表的代码:

from django.shortcuts import get_list_or_404
from special_event.models import Sponsor, SponsorLevel

sponsor_dict = 

roadie_sponsors = get_list_or_404(Sponsor, level__category = SponsorLevel.ROADIE_CHOICE)

for item in roadie_sponsors:
    try:
        sponsor_dict[item.level.name].append(item)
    except KeyError:
        sponsor_dict[item.level.name] = [item]

这就是sponsor_dict“制造”后的样子


    'Fan': [<Sponsor: Fan Sponsor>], 
    'VIP': [<Sponsor: VIP Sponsor>],
    'Groupie': [<Sponsor: Groupie Sponsor>],
    'Silver': [<Sponsor: Silver Sponsor>],
    'Bronze': [<Sponsor: Another Bronze Sponsor>, <Sponsor: Bronze Sponsor>]

我只在每个级别添加了一个赞助商,除了铜牌,只是为了展示它是如何运作的。我想做的就是将它“全部”转换为 JSON,以便 jQuery 可以轻松地解释它。 Django 的其他序列化程序(如 XML 或 YAML)可以做到这一点吗?我可以“扩展”Django JSON Serializer 来处理字典或“扩展”simplejson 来处理 Django QuerySet 对象吗?

【问题讨论】:

【参考方案1】:

我会选择扩展 simplejson。基本上,您想在 JSON 编码器遇到 QuerySet 时插入 django 的序列化。你可以使用类似的东西:

from json import dumps, loads, JSONEncoder

from django.core.serializers import serialize
from django.db.models.query import QuerySet
from django.utils.functional import curry

class DjangoJSONEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, QuerySet):
            # `default` must return a python serializable
            # structure, the easiest way is to load the JSON
            # string produced by `serialize` and return it
            return loads(serialize('json', obj))
        return JSONEncoder.default(self,obj)

# partial function, we can now use dumps(my_dict) instead
# of dumps(my_dict, cls=DjangoJSONEncoder)
dumps = curry(dumps, cls=DjangoJSONEncoder)

有关default 方法的更多信息,请查看simplejson documentation。把它放在一个 python 模块中,然后导入 dumps 就可以了。但请注意,此函数只会帮助您序列化 QuerySet 实例,而不是直接序列化 Model 实例。

【讨论】:

【参考方案2】:

在 django 中序列化大多数结构的一种非常灵活的方法是使用找到的序列化器类 here

【讨论】:

刚刚实现了这个。这个棒极了!这个剧本值得更多的认可。 这是一个非常简单且适应性强的解决方案。 好奇地看到这个基于 cmets,但是页面已经消失了。有人知道这是否还在任何地方? @AlisonR。 web.archive.org/web/20120414135953/http://www.traddicts.org/…【参考方案3】:

根据 Clement 的回答,我这样做也是为了将模型转换为 JSON。

def toJSON(obj):
   if isinstance(obj, QuerySet):
       return simplejson.dumps(obj, cls=DjangoJSONEncoder)
   if isinstance(obj, models.Model):
       #do the same as above by making it a queryset first
       set_obj = [obj]
       set_str = simplejson.dumps(simplejson.loads(serialize('json', set_obj)))
       #eliminate brackets in the beginning and the end 
       str_obj = set_str[1:len(set_str)-2]
   return str_obj

【讨论】:

如果您有问题需要点击右上角的“提问”按钮。 “您的答案”表单用于发布答案。 我很抱歉。我只打算用它来补充这个主题,因为主要答案指出它无法序列化对象。这个目标已经实现,因为代码确实有效。我关于这是一个好主意还是坏主意的问题是为了邀请有关更好集成的讨论,当然不是任何人的蔑视

以上是关于JSON 使用 simplejson 序列化 Django 模型的主要内容,如果未能解决你的问题,请参考以下文章

读取大型 JSON 文件而不挂在 Unity 中

json 和 simplejson Python 模块有啥区别?

使用 SimpleJSON 从 Web API 解析 Unity 中的 JSON 数据数组

SimpleJSON 和 NumPy 数组

anyjson与simplejson的使用

如何在 Unity3D 中将类对象转换为 JSON 字符串?