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",
(...)
}
]
}
有两个主要区别:额外的元数据(成功,总数)以及与Ext中的其他字段一起提供的对象的ID,但不包括在Django中。
有许多方法可以使一种或另一种格式符合第二种格式,但您认为哪种方法最适合这种方式?它是Django方面的特殊序列化器,还是ExtJS方面的特殊读取器......
您认为解决此问题的最佳方法是什么?
答案 0 :(得分:0)
更好的主意:使用自定义序列化器。
SERIALIZATION_MODULES = {
'extjson': 'extjs.serialiser.json'
}
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,
}
json_serializer = serializers.get_serializer("extjson")()
json_serializer.serialize(queryset, ensure_ascii=False)
答案 1 :(得分:0)
我找到了一个能够序列化对象的解决方案,其中包含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'])
我喜欢你的回答托马斯,但我需要一些更灵活的东西。