序列化包含django查询集的对象

时间:2010-01-19 13:41:10

标签: python django json

Django提供了序列化查询集的工具(django.core.serializers),但序列化生活在其他对象(如字典)中的查询集呢?

我想序列化以下词典:

dictionary = { 'alfa': queryset1, 'beta': queryset2, } 

我决定使用 simplejson (随django一起提供)。 我通过以下方式扩展了 simplejson.JSONEncoder

from django.utils import simplejson
from django.core import serializers

class HandleQuerySets(simplejson.JSONEncoder):
     """ simplejson.JSONEncoder extension: handle querysets """
     def default(self, obj):
         if isinstance(obj, QuerySet):
             return serializers.serialize("json", obj, ensure_ascii=False)

         return simplejson.JSONEncoder.default(self, obj)

然后我做:simplejson.dumps( dictionary, cls=HandleQuerySets),但返回的指南针看起来像这样:

{ "alfa": "[{\"pk\": 1, \"model\": \"someapp.somemodel\", \"fields\": {\"name\": \"alfa\"}}]",
  "beta": "[{\"pk\": 1, \"model\": \"someapp.somemodel\", \"fields\": {\"name\": \"alfa\"}}]" }

Django生成的JSON作为字符串插入字典,而不是JSON。我做错了什么?

1 个答案:

答案 0 :(得分:10)

执行此操作的正确方法是:

from django.utils import simplejson
from django.core import serializers
from django.db.models.query import QuerySet

class HandleQuerySets(simplejson.JSONEncoder):
     """ simplejson.JSONEncoder extension: handle querysets """
     def default(self, obj):
         if isinstance(obj, QuerySet):
             return serializers.serialize("python", obj, ensure_ascii=False)
         return simplejson.JSONEncoder.default(self, obj)

因为serializers.serialize("json", [...])返回一个字符串;如果你要求python序列化器,你会得到一个字典,json会对编码器的default方法返回的内容进行编码。有关详细信息,请查看json documentation

您必须在编码器类中处理更多类型(例如日期时间对象),但您明白了。