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

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文档以获取详细信息.

您将不得不在编码器类中处理更多类型(例如日期时间对象),但您明白了.