python - 序列化包含 Django 查询集的对象

标签 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 插入到字典中。我做错了什么?

最佳答案

正确的做法是:

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/

相关文章:

c# - 使用 ServiceStack 的 JsonSerializer 序列化包含一些空项的数组

json - curl 以添加索引模式和json文件以创建仪表板

python - 将 Jython 与 Django 一起使用?

python - 无法从 cPanel cron 作业调用 Python 3

Python yfinance HTTPError : HTTP Error 404: Not Found

django - 从查询集中的 jsonfield 中选择值

python - python中的平方根算法

django - SelectMultiple 小部件中的默认选定选项

javascript - 服务人员和 Django

java - 使用 json 将 javascript 数组传递给 java 数组