有没有办法控制django中的json序列化?下面的简单代码将返回 json 中的序列化对象:
co = Collection.objects.all()
c = serializers.serialize('json',co)
json 看起来类似于:
[
{
"pk": 1,
"model": "picviewer.collection",
"fields": {
"urlName": "architecture",
"name": "\u0413\u043e\u0440\u043e\u0434 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430",
"sortOrder": 0
}
},
{
"pk": 2,
"model": "picviewer.collection",
"fields": {
"urlName": "nature",
"name": "\u041f\u0440\u0438\u0440\u043e\u0434\u0430",
"sortOrder": 1
}
},
{
"pk": 3,
"model": "picviewer.collection",
"fields": {
"urlName": "objects",
"name": "\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043d\u0430\u0442\u044e\u0440\u043c\u043e\u0440\u0442",
"sortOrder": 2
}
}
]
你可以看到它正在以一种你能够重新创建整个模型的方式对其进行序列化,你是否想在某个时候这样做 - 很公平,但在我的例子中对于简单的 JS ajax 不是很方便:我希望将流量降到最低并使整个事情更清晰一些。
我所做的是创建一个将对象传递给 .json 模板的 View ,该模板将执行类似这样的操作以生成“更好的”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 生成应该是模型的一部分(如果我错了请纠正我)并使用 native python-json 和 django 实现完成,但无法弄清楚如何让它去掉我没有的位'想要。
还有一件事——即使我将它限制为一组要序列化的字段,它也会始终将 id 保留在元素容器之外,而不是在元素容器之外将其显示为“pk”。
最佳答案
这真的很简单。快速示例:
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")
此 View 将返回以下 JSON 的等效内容:
{"string": "test",
"number": 42,
"array": [1, 2, 3],
"js_object": {foo: "bar"}}
编辑:是的,Assaf Lavie 是对的,您的模板可能会生成无效的 JSON。
关于python - django:控制json序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5129794/