Переопределите Django Object Serializer, чтобы избавиться от указанной модели - PullRequest
3 голосов
/ 28 марта 2011

Мне нужно преобразовать объект Django Queryset в строку Json.Встроенная библиотека Django Serialization прекрасно работает.Хотя в нем указывается название модели, из которой она была создана.Так как мне это не нужно, как мне от этого избавиться?Что еще мне нужно переопределить, чтобы иметь возможность использовать переопределенный метод end_object ниже?

class Serializer(PythonSerializer):
    def end_object(self, obj):
        self.objects.append({
            "model"  : smart_unicode(obj._meta), # <-- I want to remove this
            "pk"     : smart_unicode(obj._get_pk_val(), strings_only=True),
            "fields" : fields
        })  
        self._current = None

Ответы [ 3 ]

10 голосов
/ 24 апреля 2011

Извините, я полностью забыл об этом вопросе.Вот как я решил эту проблему (благодаря FunkyBob на #django):

from django.core.serializers.python import Serializer

class MySerialiser(Serializer):
    def end_object( self, obj ):
        self._current['id'] = obj._get_pk_val()
        self.objects.append( self._current )

 # views.py
 serializer = MySerialiser()
 data = serializer.serialize(some_qs)
4 голосов
/ 24 мая 2013

Вот сериализатор, который удаляет все метаданные (рк, модели) из сериализованного вывода и перемещает поля на верхний уровень каждого объекта.Протестировано в django 1.5

from django.core.serializers import json


class CleanSerializer(json.Serializer):

    def get_dump_object(self, obj):
        return self._current


Serializer = CleanSerializer

Редактировать:

При переносе моего приложения на более старую версию django (вызванную сменой хостинг-провайдера) вышеуказанный сериализатор перестал работать.Ниже приведен сериализатор, который обрабатывает ссылочные версии:

import logging
import django

from django.core.serializers import json
from django.utils.encoding import smart_unicode


class CleanSerializer148(json.Serializer):

    def end_object(self, obj):
        current = self._current
        current.update({'pk': smart_unicode(obj._get_pk_val(),
                                            strings_only=True)})
        self.objects.append(current)
        self._current = None


class CleanSerializer151(json.Serializer):

    def get_dump_object(self, obj):
        self._current['pk'] = obj.pk
        return self._current


if django.get_version() == '1.4.8':
    CleanSerializer = CleanSerializer148

else:
    CleanSerializer = CleanSerializer151


Serializer = CleanSerializer
3 голосов
/ 21 апреля 2011

Переопределить класс сериализатора JSON:

from django.core.serializers.json import Serializer, DjangoJSONEncoder
from django.utils import simplejson

class MySerializer(Serializer):
"""
Convert QuerySets to JSONS, overrided to remove "model" from JSON
"""

def end_serialization(self):

    # little hack
    cleaned_objects = []

    for obj in self.objects:
        del obj['model'] 
        cleaned_objects.append(obj)

    simplejson.dump(cleaned_objects, self.stream, cls=DjangoJSONEncoder, **self.options)

В представлении:

    JSONSerializer = MySerializer
    jS = JSONSerializer()
...