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

Posted

技术标签:

【中文标题】将 Django 对象传递给 ExtJS 的正确方法【英文标题】:Right way to pass Django objects to ExtJS 【发布时间】:2011-11-12 18:04:29 【问题描述】:

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",
            (...)
        
    ]

有两个主要区别:额外的元数据(成功、总计)和对象的 ID,它们在 Ext 中与其他字段一起提供,但在 Django 中没有。

有许多可能的方法可以使一种或另一种格式与第二种格式一致,但是您认为实现此目的的最佳方法是什么?是 Django 端的特殊序列化器,还是 ExtJS 端的特殊阅读器……

你认为解决这个问题最好的方法是什么?

【问题讨论】:

如果您喜欢这些答案中的任何一个,请将其中一个标记为已接受。 【参考方案1】:

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

settings.py

​​>
SERIALIZATION_MODULES = 
  'extjson': 'extjs.serialiser.json'

extjs\serializer\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,
        

你的代码.py

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

【讨论】:

【参考方案2】:

我找到了一个能够序列化对象的解决方案,其中包含 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'])

我喜欢你的回答 Thomas,但我需要一些更灵活的东西。

【讨论】:

此链接现已失效:(

以上是关于将 Django 对象传递给 ExtJS 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将参数传递给 Django 中的基于类的视图实例?

如何正确地将参数传递给基于类的视图测试 Django Rest Framework?

如何将用户对象传递给 Django 中的表单

将 Django 视图中的数据作为 JSON 对象传递给 vue 实例

在 extjs MVC 架构中如何将参数传递给函数

extjs 上下文菜单单击,将父网格作为参数传递给控制器​​方法