一尘不染

使用simplejson对JSON模型进行JSON序列化

json

我想使用simplejson序列化Django模型。Django的序列化器不支持字典…,而simplejson不支持Django
Querysets。这是一个难题。

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

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对象?


阅读 306

收藏
2020-07-27

共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)

有关defaultmethod的更多信息,请查看simplejson文档。将其放在python模块中,然后导入dumps,您就可以开始了。但是请注意,此功能将仅帮助您序列化QuerySet实例,而不能Model直接序列化实例。

2020-07-27