我想使用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“制造”后的样子
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)
有关defaultmethod的更多信息,请查看simplejson文档。将其放在python模块中,然后导入dumps,您就可以开始了。但是请注意,此功能将仅帮助您序列化QuerySet实例,而不能Model直接序列化实例。
default
dumps
QuerySet
Model