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 插入到字典中。我做错了什么?
最佳答案
正确的做法是:
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了解详情。
您将不得不在编码器类中处理更多类型(例如日期时间对象),但您明白了。
关于python - 序列化包含 Django 查询集的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2093840/