2010-01-19 63 views
4

Django提供了序列化查詢集(django.core.serializers)的工具,但是如何序列化存在於其他對象(如字典)中的查詢集呢?序列化包含Django查詢集的對象

我想要序列以下字典:

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),但返回dicionary看起來是這樣的:

{ "alfa": "[{\"pk\": 1, \"model\": \"someapp.somemodel\", \"fields\": {\"name\": \"alfa\"}}]", 
    "beta": "[{\"pk\": 1, \"model\": \"someapp.somemodel\", \"fields\": {\"name\": \"alfa\"}}]" } 

Django的生成JSON插入到字典中字符串,而不是JSON。我究竟做錯了什麼?

回答

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

你將不得不在你的編碼器類中處理更多的類型(比如datetime對象),但你明白了。

+0

謝謝!我對django.core.serializers.json導入DjangoJSONEncoder'做了一些細微的修改,然後你可以擴展DjangoJSONEncoder而不是simplejson.JSONEncoder。然後,將HandleQuerySets中的最後一行更改爲'return DjangoJSONEncoder.default(self,obj)' – pifantastic 2011-09-07 21:55:40

+0

先生,您是一位紳士和學者。 – 2012-03-28 00:25:58

相關問題