Django:控制json序列化

2024-09-29 04:27:54 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法在django中控制json序列化?下面的简单代码将以json格式返回序列化对象:

co = Collection.objects.all()
c = serializers.serialize('json',co)

json将类似于:

^{pr2}$

你可以看到它在以一种你可以重新创建整个模型的方式序列化它,你想在某个时候这样做吗-公平,但对简单的JS-ajax来说不是很方便:我想把流量降到最低,让整个事情变得更清晰。在

我所做的是创建一个将对象传递给.json模板的视图,该模板将执行以下操作以生成“更好”的json输出:

[
{% if collections %}
    {% for c in collections %}
{"id": {{c.id}},"sortOrder": {{c.sortOrder}},"name": "{{c.name}}","urlName": "{{c.urlName}}"}{% if not forloop.last %},{% endif %}
    {% endfor %}
{% endif %}
]

这确实有效,而且输出量很大(?)更好:

[
    {
        "id": 1,
        "sortOrder": 0,
        "name": "Город и архитектура",
        "urlName": "architecture"
    },
    {
        "id": 2,
        "sortOrder": 1,
        "name": "Природа",
        "urlName": "nature"
    },
    {
        "id": 3,
        "sortOrder": 2,
        "name": "Объекты и натюрморт",
        "urlName": "objects"
    } 
]

但是,我的解决方案使用模板的速度太快了(这是处理过程中的一个额外步骤,可能会对性能产生影响),例如,如果要更新模型,则需要手动维护。在

我认为json生成应该是模型的一部分(如果我错了,请纠正我),并使用本机pythonjson和django实现来完成,但无法确定如何使它去掉我不想要的部分。在

还有一件事——即使我将它限制为一组要序列化的字段,它也会将id始终保持在元素容器之外,而将其作为“pk”显示在元素容器之外。在


Tags: 对象djangoname模型模板idjsonif
3条回答

那真的很简单。简单示例:

from django.http import HttpResponse
from django.utils import simplejson

def simple_view(request):
    response = {'string': "test",
                'number': 42,
                'array': [1, 2, 3],
                'js_object': dict(foo="bar")}
    return HttpResponse(simplejson.dumps(response),
                        mimetype="application/json")

此视图将返回等效于以下JSON:

^{pr2}$

编辑:是的,assaflavie是对的,你的模板可以抛出无效的JSON。在

我建议您使用the json library对数据进行编码,而不是自己构造类似json的字符串。首先,上面的代码似乎不能正确地处理转义。编写自己的序列化程序并没有什么好处(除了bug)。在

与其自己编写任何东西,不如让Piston将Django模型序列化为JSON。默认情况下,它只是序列化模型的字段,没有元数据。你可以很容易地列出要包括或排除哪些字段,甚至是相关字段。没有额外的模板,视图代码很少。在

相关问题 更多 >