Paw*_*iak 5 python django json
Django提供了序列化查询集(django.core.serializers)的工具,但是如何序列化生活在其他对象(如字典)中的查询集呢?
我想序列化以下字典:
dictionary = { 'alfa': queryset1, 'beta': queryset2, }
Run Code Online (Sandbox Code Playgroud)
我决定使用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)
Run Code Online (Sandbox Code Playgroud)
然后我这样做了simplejson.dumps( dictionary, cls=HandleQuerySets),但是返回的dicionary看起来像这样:
{ "alfa": "[{\"pk\": 1, \"model\": \"someapp.somemodel\", \"fields\": {\"name\": \"alfa\"}}]",
"beta": "[{\"pk\": 1, \"model\": \"someapp.somemodel\", \"fields\": {\"name\": \"alfa\"}}]" }
Run Code Online (Sandbox Code Playgroud)
Django生成的JSON作为字符串插入字典,而不是JSON.我究竟做错了什么?
Lup*_*uch 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)
Run Code Online (Sandbox Code Playgroud)
因为serializers.serialize("json", [...])返回一个字符串; 如果你要求python序列化器,你会得到一个字典,json会对编码器default方法返回的内容进行编码.查看json文档以获取详细信息.
您将不得不在编码器类中处理更多类型(例如日期时间对象),但您明白了.
| 归档时间: |
|
| 查看次数: |
4796 次 |
| 最近记录: |