使用simplejson序列化Django模型

使用simplejson序列化Django模型,django,json,serialization,django-queryset,Django,Json,Serialization,Django Queryset,我想使用simplejson序列化Django模型。Django的序列化程序不支持字典。。。simplejson不支持Django查询集。这是个难题 在这个模型中,赞助商有一个到赞助商级别的外键,我试图将属于某个赞助商级别的所有赞助商分组在一起。以下是生成列表的代码: from django.shortcuts import get_list_or_404 from special_event.models import Sponsor, SponsorLevel sponsor_dict =

我想使用simplejson序列化Django模型。Django的序列化程序不支持字典。。。simplejson不支持Django查询集。这是个难题

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

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]
以下是“制作”后赞助商的样子

{
“范”:[],
“VIP”:[],
“Groupie”:[],
“白银”:[],
“青铜色”:[,]
}

除了铜牌,我在每个级别只增加了一个赞助商,只是为了展示它是如何工作的。我想做的就是将它“全部”转换成JSON,这样jQuery就可以轻松地解释它。Django的其他序列化程序(如XML或YAML)可以实现这一点吗?我是否可以“扩展”Django JSON序列化程序以处理字典,或者“扩展”simplejson以处理Django QuerySet对象?

我会选择扩展simplejson。基本上,当JSON编码器遇到查询集时,您希望插入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)

有关
default
方法的更多信息,请查看。将其放入python模块,然后导入
转储文件
,就可以开始了。但是请注意,这个函数只会帮助您序列化
QuerySet
实例,而不是直接序列化
Model
实例。

根据Clement的回答,我这样做也是为了将模型转换成JSON

def toJSON(obj):
   if isinstance(obj, QuerySet):
       return simplejson.dumps(obj, cls=DjangoJSONEncoder)
   if isinstance(obj, models.Model):
       #do the same as above by making it a queryset first
       set_obj = [obj]
       set_str = simplejson.dumps(simplejson.loads(serialize('json', set_obj)))
       #eliminate brackets in the beginning and the end 
       str_obj = set_str[1:len(set_str)-2]
   return str_obj

在django中序列化大多数结构的一种非常灵活的方法是使用找到的序列化程序类

,如果您有问题,需要单击右上角的“提问”按钮。“你的答案”表格是用来张贴答案的。我很抱歉。我只是想补充一下这个主题,因为主要的答案说明了它无法序列化对象。这一目标已经实现,因为代码确实有效。我提出的关于它是好主意还是坏主意的问题是为了邀请大家讨论更好的集成,当然没有人会轻蔑地实现这一点。太棒了!这个脚本值得更多的认可。这是一个非常简单和适应性强的解决方案。很想根据评论看到这个,但是页面已经不存在了。有人知道这是否还在附近吗?@AlisonR。
def toJSON(obj):
   if isinstance(obj, QuerySet):
       return simplejson.dumps(obj, cls=DjangoJSONEncoder)
   if isinstance(obj, models.Model):
       #do the same as above by making it a queryset first
       set_obj = [obj]
       set_str = simplejson.dumps(simplejson.loads(serialize('json', set_obj)))
       #eliminate brackets in the beginning and the end 
       str_obj = set_str[1:len(set_str)-2]
   return str_obj