JSON使用simplejson序列化Django模型 [英] JSON Serializing Django Models with simplejson
问题描述
我想使用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(赞助商,level__category = SponsorLevel.ROADIE_CHOICE)
for roadie_sponsors中的项目:
try
sponsor_dict [item.level.name] .append(item)
除了KeyError:
sponsor_dict [item.level.name] = [item]
这是什么 sponsor_dict
看起来像一次做
{
'Fan':[<赞助者:粉丝赞助商],
'VIP':[<赞助:VIP赞助商>],
'Groupie':[<赞助商:Groupie赞助商],
'Silver':[<赞助商:银赞助商],
'Bronze':[<赞助商:另一个铜赞助商><赞助商:青铜赞助商>]
}
我只补充说一个赞助商在每个级别,除了青铜,只是为了显示它是如何工作的。所有我想做的是将其全部转换为JSON,因此jQuery可以轻松地解释它。 Django的其他序列化程序(如XML或YAML)可以实现吗?我可以扩展Django JSON序列化器来处理字典或扩展simplejson来处理Django QuerySet对象?
继续使用 simplejson 。基本上,当JSON编码器遇到QuerySet时,您要插入django的序列化。您可以使用以下类似的东西:
从json import转储,加载,JSONEncoder
/ pre>
从django.core .serializers import django.db.models.query import serialize
从django.utils.functional导入curry
$ b class DjangoJSONEncoder(JSONEncoder)
def default (self,obj):
如果isinstance(obj,QuerySet):
#`default`必须返回一个python serializable
#结构,最简单的方法是加载JSON
#string由`serialize`生成并返回
return loaded(serialize('json',obj))
return JSONEncoder.default(self,obj)
#partial function我们现在可以使用dumps(my_dict)而不是
#的转储(my_dict,cls = DjangoJSONEncoder)
dumps = curry(dumps,cls = DjangoJSONEncoder)
有关
默认
方法的更多信息,请查看 simplejson文档。把它放在一个python模块中,然后导入dumps
,你很好。但是请注意,此函数只会帮助您直接序列化QuerySet
实例,而不是模型
实例。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]
Here's what
sponsor_dict
looks like once it's "made"{ 'Fan': [<Sponsor: Fan Sponsor>], 'VIP': [<Sponsor: VIP Sponsor>], 'Groupie': [<Sponsor: Groupie Sponsor>], 'Silver': [<Sponsor: Silver Sponsor>], 'Bronze': [<Sponsor: Another Bronze Sponsor>, <Sponsor: Bronze Sponsor>] }
I only added one sponsor in each level, except for bronze, just to show how it works. All I want to do is get it "all" into JSON so jQuery can interpret it easily. Can Django's other serializers (like XML or YAML) accomplish this? Can I "extend" the Django JSON Serializer to handle dictionaries or "extend" simplejson to handle Django QuerySet objects?
解决方案I would go with extending simplejson. Basically, you want to plug in django's serialization when the JSON encoder encounters a QuerySet. You could use something like:
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 importdumps
and you're good to go. But note that this function will only help you serializingQuerySet
instances, notModel
instances directly.这篇关于JSON使用simplejson序列化Django模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!