Правильный способ передачи объектов Django в ExtJS - PullRequest
1 голос
/ 12 ноября 2011

Django имеет встроенную функциональность сериализации, которая позволяет вам сериализовать любой набор результатов запроса в JSON:

json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(queryset, ensure_ascii=False)

Это приводит к выводу, например:

[
  {
    "pk": 1, 
    "model": "app_name.model_name", 
    "fields": {
      "field_name": "value", 
      (...)
    }
  }
]

Если вы хотитеПередайте этот объект JSON в приложение, управляемое ExtJS, с которым вы столкнулись с проблемой, потому что ExtJS ожидает, что его JSON будет отформатирован по-разному:

{
    "total": 100,
    "success": true,
    "objects": [
        {
            "id": 1,
            "field_name": "value",
            (...)
        }
    ]
}

Существует 2 основных различия: дополнительные метаданные (успех, итог) и идентификаторы объектов, которые предоставляются вместе с другими полями в Ext, но не в Django.

Существует много возможных способов привести один или другой формат в соответствие со вторым, но что вы считаетебыть лучшим способом сделать эту работу?Это специальный сериализатор на стороне Django, или, может быть, специальный читатель на стороне ExtJS ...

Какой, по вашему мнению, лучший способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2011

Я нашел решение, которое может сериализовать объекты, которые содержат QuerySet в качестве атрибутов. Он взят из блога traddicts.org, но теперь вы можете найти его на GitHub:

https://github.com/datamafia/django-query-json-serializer/blob/master/JSONSerializer.py

Я также изменил код, чтобы он работал рекурсивно, поэтому я могу сделать следующее:

users = User.objects.all()
response = {}
response['success'] = True
response['users'] = users
json_serialize(response)
json_serialize(response, serialize_related=True)
json_serialize(response, serialize_related=True, ignored=['users.groups'])
json_serialize(response, serialize_related=True, ignored=['users.groups.permissions'])

Мне нравится твой ответ, Томас, но мне нужно что-то более гибкое.

0 голосов
/ 13 ноября 2011

Лучшая идея: использовать собственный сериализатор.

settings.py

SERIALIZATION_MODULES = {
  'extjson': 'extjs.serialiser.json'
}

ExtJS \ serialiser \ json.py

from django.core.serialisers.json import Serialiser

class ExtJSONSerialiser(Serializer)
    """
    Serializes a QuerySet to basic Python objects.
    """

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

    def getvalue(self):
        return {
            'total': len(self.objects),
            'success': True,
            'objects': self.objects,
        }

yourcode.py

json_serializer = serializers.get_serializer("extjson")()
json_serializer.serialize(queryset, ensure_ascii=False)
...