Сериализация объектов, содержащих наборы запросов django - PullRequest
5 голосов
/ 19 января 2010

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.Что я делаю не так?

1 Ответ

10 голосов
/ 19 января 2010

Правильный способ сделать это будет:

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 .

Вам придется обрабатывать больше типов в вашем классе кодировщика (например, объекты даты и времени), но вы поймете идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...