JSON使用simplejson序列化Django模型 [英] JSON Serializing Django Models with simplejson

查看:149
本文介绍了JSON使用simplejson序列化Django模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用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 

从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)
/ pre>

有关默认方法的更多信息,请查看 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 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使用simplejson序列化Django模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆