Как включить дополнительные данные в ответ сериализатора Django? - PullRequest
4 голосов
/ 05 января 2009

Я пытаюсь сделать livesearch с помощью Django и jQuery. Что я сделал, так это заставил javascript запрашивать некоторые данные с помощью функции getJSON, затем я настроил представление в Django, которое возвращает ответ JSON, автоматизированный сериализатором Django.

И это хорошо работает, он возвращает ответ json с типом содержимого text / javascript. Чтобы избежать отправки всех данных (много чего мне не нужно) я сделал это:

response.write(serializers.serialize("json", soknad_list, fields=('name', 'image', 'genre')))

Но, например, поле 'genre' - это поле manyToMany, поэтому возможно ли получить значения, например, из genre.all.0, а не только идентификатор жанра?

И модель имеет функцию get_absolute _url, возможно ли включить это в ответ JSON, если да, то как?

Так что я предполагаю, что мой вопрос заключается в том, возможно ли включить в ответ JSON что-либо, кроме необработанных данных полей, если нет, как бы вы решили решить мою проблему?

Ответы [ 3 ]

3 голосов
/ 07 января 2009

Сериализация DJango JSON основана на simplejson, который вы можете использовать напрямую и расширять по своему желанию для обработки любых типов объектов. Таким образом, у вас в основном есть два варианта: либо вручную создать список диктов с соответствующими данными, и передать его в simplejson.dumps () (который по умолчанию поддерживает строки, списки, диктанты и числа) или написать свой собственный кодер json, который знает, как сериализовать ваш конкретный набор данных. Кстати, вот (не очень хорошо проверенный, но работавший до сих пор) модель Json с кодировкой Django:

from django.utils import simplejson
from django.utils import datetime_safe
from django.utils.functional import Promise
from django.utils.translation import force_unicode
from django.utils.encoding import smart_unicode
from django.core.serializers.json import DjangoJSONEncoder

class ModelJSONEncoder(DjangoJSONEncoder):
    """
    (simplejson) DjangoJSONEncoder subclass that knows how to encode fields.

    (adated from django.serializers, which, strangely, didn't
     factor out this part of the algorithm)
    """
    def handle_field(self, obj, field):
        return smart_unicode(getattr(obj, field.name), strings_only=True)

    def handle_fk_field(self, obj, field):
        related = getattr(obj, field.name)
        if related is not None:
            if field.rel.field_name == related._meta.pk.name:
                # Related to remote object via primary key
                related = related._get_pk_val()
            else:
                # Related to remote object via other field
                related = getattr(related, field.rel.field_name)
        return smart_unicode(related, strings_only=True)

    def handle_m2m_field(self, obj, field):
        if field.creates_table:
            return [
                smart_unicode(related._get_pk_val(), strings_only=True)
                for related
                in getattr(obj, field.name).iterator()
                ]

    def handle_model(self, obj):
        dic = {}
        for field in obj._meta.local_fields:
            if field.serialize:
                if field.rel is None:
                    dic[field.name] = self.handle_field(obj, field)
                else:
                    dic[field.name] = self.handle_fk_field(obj, field)
        for field in obj._meta.many_to_many:
            if field.serialize:
                dic[field.name] = self.handle_m2m_field(obj, field)
        return dic

    def default(self, obj):
        if isinstance(o, Promise):
            return force_unicode(o)

        if isinstance(obj, Model):
            return self.handle_model(obj)

        return super(ModelJSONEncoder, self).default(obj)

НТН

2 голосов
/ 22 апреля 2009

Существует удобное стороннее приложение / сериализатор django, которое позволит вам включать дополнительные данные. Он также позволяет включать отношения модели и исключать список полей.

Доступно на http://code.google.com/p/wadofstuff/wiki/DjangoFullSerializers

1 голос
/ 11 января 2009

Я обнаружил, что самой простой вещью было вообще не использовать сериализатор. Я не знаю, почему я не подумал об этом раньше, но я просто использовал общий список объектов, изменил mimetype на text / javascript и сделал шаблон JSON вместо HTML-шаблона.

Очень просто, и таким образом мне удалось получить все данные, которые я хотел, в ответ JSON. Таким образом, вы можете добавить все, что вы можете добавить в HTML-шаблон в ответ JSON, даже разбив на страницы.

Пример извлечения созданного мною представления:

return object_list(request, queryset=object_list, template_name='search/results.js', template_object_name='result', paginate_by=12, mimetype='text/javascript')

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