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。我做错了什么?
答案 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。
您必须在编码器类中处理更多类型(例如日期时间对象),但您明白了。