DJango:格式化json序列化

时间:2013-11-21 00:15:10

标签: python django json

我有以下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"
     }
  }, 
  ....
 }

4 个答案:

答案 0 :(得分:17)

你可以用这种方式获得漂亮的格式:

return JsonResponse(your_json_dict, json_dumps_params={'indent': 2})

django doc as the first comment say

答案 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通常由其他代码或服务处理,因此只要数据结构正确,它们就不关心缩进。