I'd like to use simplejson to serialize a Django model. Django's serializer doesn't support dictionaries... and simplejson doesn't support Django Querysets. This is quite a conundrum.

In the model there's sponsors that have a Foreign Key to sponsor level, I'm trying to group all the sponsors that belong to a certain sponsor level together. Here's the code that generates the list:

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序列化程序来处理字典,还是"扩展"simplejson来处理Django QuerySet对象?

推荐答案

我同意延长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)

For more info on default method, have a look at simplejson documentation. Put that in a python module, then import dumps and you're good to go. But note that this function will only help you serializing QuerySet instances, not Model instances directly.

Json相关问答推荐

PowerShell脚本未按预期生成预期的JSON输出

创建Json嵌套文件 struct

序列化从/到空值

在 python 中循环 JSON 数组

Bicep脚本中如何设置弹性池的维护窗口?

在Databricks中如何将JSON文件作为字典读取

jq 中的整个单词匹配

jq:用列表包装所有第一级原子值

使用 System.Text.Json 序列化记录成员

N1QL 聚合查询 Couchbase

Google GCM 服务器返回未经授权的错误 401

一起使用 Argparse 和 Json

编写 JSON 日志(log)文件的格式?

如何将 LinkedHashMap 转换为自定义 java 对象?

Jackson Scala 模块的小例子?

如何使用 SwiftyJSON 将字符串转换为 JSON

waitUntilAllTask​​sAreFinished 错误 Swift

Microsoft.Net.Http 与 Microsoft.AspNet.WebApi.Client

SCRIPT5009:JSON未定义

JSON.stringify 向我的 Json 对象添加额外的 \ 和 "" 的问题