DJango:格式化json序列化

liv*_*v a 11 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")
Run Code Online (Sandbox Code Playgroud)

结果如下:

[{"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"}}]
Run Code Online (Sandbox Code Playgroud)

我的问题:1.我可以控制字段的顺序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"
     }
  }, 
  ....
 }
Run Code Online (Sandbox Code Playgroud)

]

Hoh*_*eim 19

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

return JsonResponse(your_json_dict, json_dumps_params={'indent': 2})
Run Code Online (Sandbox Code Playgroud)

django doc作为第一个评论说


Kev*_* S. 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")
Run Code Online (Sandbox Code Playgroud)

但如果Company模型很大,这就是性能问题.我建议采用Dan R的建议并使用浏览器插件来解析和渲染json或者提出其他一些客户端解决方案.我有一个脚本,它接受一个json文件,并完成与上面的代码完全相同的东西,读取json并打印出来indent=4.

至于排序输出,您可以在查询集上使用order_by方法:

def company(request):
    company_list = Company.objects.order_by("sorting_field")
    ...
Run Code Online (Sandbox Code Playgroud)

如果您始终希望该模型按此方式排序,则可以使用排序元类选项:

class Company(models.Model):

    class Meta:
        ordering = ["sorting_field"]
    ...
Run Code Online (Sandbox Code Playgroud)

最后请注意,如果您打算使用Web服务公开您的模型,我强烈建议您查看tastypie.从长远来看,它可能对您有所帮助,因为它提供了许多其他方便的功能,有助于实现这一目标.


Sim*_*ser -3

JSON 没有缩进,它只是结构化数据。浏览器或其他工具可能会格式化 JSON,使其看起来不错,但默认情况下它不存在。它也不是 JSON 的一部分,因为格式只是它在屏幕上的外观。JSON 通常由其他代码或服务处理,因此它们不关心缩进,只要数据结构正确即可。