我有以下DJango视图
def company(request):
company_list = Company.objects.all()
output = serializers.serialize('json', company_list, fields=('name','phonenumber','email','companylogo'))
return HttpResponse(output, content_type="application/json")
结果如下:
[{"pk": 1, "model": "test.company", "fields": {"companylogo": null, "phonenumber": "741.999.5554", "name": "Remax", "email": "home@remax.co.il"}}, {"pk": 4, "model": "test.company", "fields": {"companylogo": null, "phonenumber": "641-7778889", "name": "remixa", "email": "a@aa.com"}}, {"pk": 2, "model": "test.company", "fields": {"companylogo": null, "phonenumber": "658-2233444", "name": "remix", "email": "b@bbb.com"}}, {"pk": 7, "model": "test.company", "fields": {"companylogo": null, "phonenumber": "996-7778880", "name": "remix", "email": "a@aba.com"}}]
我的问题: 我可以控制字段的顺序吗? 2.我可以更改字段的名称 3.我希望在浏览器中看到缩进的结果,而不是一条长行看到这样的东西:
[
{
"pk": 1,
"model": "test.company",
"fields":
{
"companylogo": null,
"phonenumber": "741.999.5554",
"name": "Remax",
"email": "home@remax.co.il"
}
},
{
"pk": 4,
"model": "test.company",
"fields":
{
"companylogo": null,
"phonenumber": "641-7778889",
"name": "remixa",
"email": "a@aa.com"
}
},
....
}
答案 0 :(得分:17)
你可以用这种方式获得漂亮的格式:
return JsonResponse(your_json_dict, json_dumps_params={'indent': 2})
答案 1 :(得分:7)
Python(与Django无关,从2.6开始)有一个内置的json库,可以完成所需的缩进。如果您正在寻找快速和脏的东西用于调试目的,您可以这样做:
from django.http import HttpResponse
from django.core import serializers
import json
def company(request, pretty=False):
company_list = Company.objects.all()
output = serializers.serialize('json', company_list, fields=('name','phonenumber','email','companylogo'))
if pretty:
output = json.dumps(json.loads(output), indent=4))
return HttpResponse(output, content_type="application/json")
但如果Company
模型很大,这就是性能问题。我建议采用Dan R的建议并使用浏览器插件来解析和渲染json或者提出其他一些客户端解决方案。我有一个脚本,它接受一个json文件并完成与上面代码完全相同的事情,读入json并用indent=4
打印出来。
至于排序输出,您只需在查询集上使用order_by方法:
def company(request):
company_list = Company.objects.order_by("sorting_field")
...
如果你总是希望那个模型按那种方式排序,你可以使用ordering元类选项:
class Company(models.Model):
class Meta:
ordering = ["sorting_field"]
...
最后请注意,如果您打算使用网络服务公开您的模型,我强烈建议您查看tastypie。从长远来看,它可能对您有所帮助,因为它提供了许多其他方便的功能,有助于实现这一目标。
答案 2 :(得分:2)
使用Django 1.7,我可以使用序列化程序的indent
参数很好地缩进JSON。例如,在从我的数据库转储数据的命令中:
self.stdout.write(serializers.serialize("json",
records,
indent=2))
自1.5版以来,indent
参数已在Django中。我得到的输出看起来像这样:
[
{
"fields": {
"type": "something",
"word": "something else",
},
"model": "whatever",
"pk": 887060
},
{
"fields": {
"type": "something more",
"word": "and another thing",
},
"model": "whatever",
"pk": 887061
},
...
要订购记录,您必须执行Kevin suggested并使用order_by
,或者您想要订购传递给序列化程序的记录的任何方法。例如,我使用itertools.chain
来命令返回不同模型实例的不同查询集。
序列化程序不支持根据您的偏好排序字段,或重命名它们。您必须编写自己的代码才能执行此操作或使用外部工具。
答案 3 :(得分:-1)
JSON没有缩进,它只是结构化数据。浏览器或其他工具可以格式化JSON,使其看起来不错,但默认情况下不存在。它也不是JSON的一部分,因为格式化就是它在屏幕上的样子。 JSON通常由其他代码或服务处理,因此只要数据结构正确,它们就不关心缩进。