Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Django对象传递给ExtJS的正确方法_Django_Json_Extjs_Extjs4 - Fatal编程技术网

将Django对象传递给ExtJS的正确方法

将Django对象传递给ExtJS的正确方法,django,json,extjs,extjs4,Django,Json,Extjs,Extjs4,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

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",
            (...)
        }
    ]
}
有两个主要区别:额外的元数据(success,total)和对象的id,它们与Ext中的其他字段一起提供,但在Django中不提供

有很多可能的方式使一种或另一种格式符合第二种,但是你认为什么是使这项工作最好的方法?是Django端的特殊序列化程序,还是ExtJS端的特殊读取器


您认为解决此问题的最佳方法是什么?

更好的主意:使用自定义序列化程序

设置.py extjs\serialiser\json.py yourcode.py
我找到了一个能够序列化对象的解决方案,这些对象包含QuerySet作为属性。它来自traddicts.org博客,但您现在可以在GitHub上找到它:

我进一步修改了代码以递归方式工作,因此实际上我可以执行以下操作:

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'])

我喜欢你的回答,托马斯,但我需要更灵活的回答

如果您喜欢以下任一答案,请将其中一个标记为已接受。此链接现在已失效:(
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)
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'])