2010-06-16 3 views
4

Я работаю над веб-сервисом на основе Django, и я пытаюсь выяснить, каким будет лучший способ сделать сериализацию.Django: пользовательские варианты сериализации?

Однако сложным требованием является то, что я хотел бы иметь полный контроль над форматом и полями, содержащимися в ответе.

Например, сериализаторы Django (который, к сожалению, включает wadofstuff serializer), автоматически обертывают поля в { model: "app.Model", pk: 42, fields: { ... }}, что отлично подходит для создания светильников, но для меня это не очень удобно - ,

Кроме того, я хотел бы, чтобы сериализатор знал объекты Django, поэтому, например, он будет делать правильную вещь с помощью QuerySet или ManyToManyField.

В настоящее время я думаю об использовании django-piston's emitters.py, но мой опыт работы с django-piston был только посредственным, поэтому я хотел бы посмотреть, есть ли другие варианты.

Итак, есть ли другие возможности для настраиваемых сериализаторов Django?

ª: Это редко документировано и проверено, и у меня были некоторые проблемы с сериализатором.

+0

О, да: формат. Я собираюсь получить AMF-кодирование результата и отправить его клиенту Flash, поэтому сериализатор должен создать структуру данных, состоящую только из примитивных типов (dicts, numbers, strings и т. Д.). –

ответ

1

Вы посмотрели на джанго-поршень? У него должно быть множество вещей, чтобы сделать это проще.

(Не уверены, сериализация специально, но Джанго Resty веб-сервисы.)

+0

Способ прочитать вопрос, djc;) Да, я посмотрел на django-piston, и это может закончиться тем, что использует его сериализатор. Я не уверен, хочу ли я все это использовать, потому что у меня был некоторый посредственный опыт. И я отправляю данные во Flash (чтобы PyAMF делал гораздо более приятную работу) ... Но, конечно, что все может измениться: P –

+0

К сожалению, об этом! – djc

1

Когда мне нужна некоторые пользовательские сериализации очень быстро, и мой случай не требует десериализаций я просто пишу шаблон Джанго, который может сделать любой формат, я хочу из списка/запроса/объекта. Затем вы можете вызвать render_to_string с соответствующим контекстом, и ваши данные будут сериализованы.

UPDATE: некоторые короткий пример

Допустим, вы хотите получить JSon формат, понимаемый datatables.net plugin. Поскольку существуют некоторые специальные параметры, требуемые для сериализации запроса с использованием simplejson или sth else, здесь невозможно (или может быть не так просто). Мы обнаружили, что самый быстрый способ обеспечить такую ​​структуру, чтобы создать простой шаблон, как этот:

{ 
    "sEcho": {{sEcho}}, 
    "iTotalRecords": {{iTotalRecords}}, 
    "iTotalDisplayRecords": {{iTotalDisplayRecords}}, 
    "aaData":[ 
    {% for obj in querySet %} 
    [ 
     "{{obj.name}}", 
     "{{obj.message|truncatewords:20}}", 
     "<a href=\"{% url some_view obj.id %}\">{{obj.name}}</a>" 
    ] 
    {% if not forloop.last %} 
    , 
    {% endif %} 
    {% endfor %} 
    ] 
} 

, которая делает для красивых JSON, что мы искали. Он также дает вам полный контроль над форматом. Другими преимуществами являются способность изменять поля объектов с помощью встроенных фильтров django, которые в нашем случае были действительно полезными.

Я знаю, что это не сериализация, как описано в книгах, но если вы хотите преобразовать какой-либо объект в пользовательский формат, это решение может быть самым быстрым. По какой-то причине разработчики django разрешили отображать шаблон в любой формат не только html, так почему бы не использовать его?

Пример, показанный выше, очень конкретный, но вы можете сгенерировать любой другой формат. Конечно, для написания десериализатора, который мог бы восстановить объект из этого формата, может быть больно, но если вам это не нужно ...

+0

ಠ_ಠ это звучит как рецепт боли. Не было бы проще вручную преобразовать данные в «базовый» объект, а затем использовать json/whatever для сериализации? –

+0

нет нет. Вы лично упоминали, что некоторые сериализаторы выводят данные, соответствующие их конкретной структуре. Я использую это для создания некоторого формата json, который был слишком сложным, чтобы получить другой путь. Конечно, если у вас есть идея написать сериализатор - сделайте это :) – dzida

+0

Хорошо, хорошо, может быть, я просто недостаточно творческий. Не могли бы вы дать небольшой пример того, о чем вы думаете? Например, я имел в виду что-то вроде этого: 'serialized = [{" name ": person.name," friends ": [{" name ": friend.name} для друга в person.friends.all() ]} для людей в людях]; return simplejson.dumps (serialized); ' –

1

EDIT:

Сейчас на https://bitbucket.org/sebpiq/any2any/


В настоящее время я пишу полнофункциональную рамки сериализации для Django. Цель состоит в том, чтобы полностью контролировать сериализацию. Это, вероятно, заполнило бы ваши требования довольно хорошо! Однако он еще не готов. Полагаю, что через 1 или 2 недели я смогу выпустить первую версию.

Вы по-прежнему можете проверить код google: http://code.google.com/p/django-serializable/, даже можете помочь, если вы заинтересованы в нем.

Будет выпущена бесплатная версия, когда выйдет первый релиз!

+0

Удивительный! Я добавил RSS-каналы к моему читателю, и я с нетерпением жду того, что вы потушили. –

+0

Привет, Дэвид! Это еще не готово, потому что в последнее время я очень занят другими делами, но вы можете проверить это: он может уже сериализовать/десериализовать модели и их родителей. Единственная проблема в том, что она еще не очень стабильна ... – sebpiq