[英]DJango: formatting json serialization
我有以下 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"}}]
我的問題: 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"
}
},
....
}
]
你可以通過這種方式獲得漂亮的格式:
return JsonResponse(your_json_dict, json_dumps_params={'indent': 2})
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")
...
如果您總是希望以這種方式對模型進行排序,則可以使用排序元類選項:
class Company(models.Model):
class Meta:
ordering = ["sorting_field"]
...
最后要說明的是,如果您的目的是使用 Web 服務公開模型,我強烈建議您查看一下ttletypie 。 從長遠來看,它可能會對您有所幫助,因為它提供了許多其他方便的功能來幫助實現這一目標。
在 Django 1.7 中,我可以通過使用序列化程序的indent
參數獲得很好的縮進 JSON。 例如,在從我的數據庫轉儲數據的命令中:
self.stdout.write(serializers.serialize("json",
records,
indent=2))
indent
參數從 1.5 版開始就存在於 Django 中。 我得到的輸出如下所示:
[
{
"fields": {
"type": "something",
"word": "something else",
},
"model": "whatever",
"pk": 887060
},
{
"fields": {
"type": "something more",
"word": "and another thing",
},
"model": "whatever",
"pk": 887061
},
...
要對您的記錄進行排序,那么您必須按照Kevin 的建議進行操作並使用order_by
或任何您想要對傳遞給序列化程序的記錄進行排序的方法。 例如,我使用itertools.chain
對返回不同模型實例的不同查詢集進行排序。
序列化程序不支持根據您的喜好對字段進行排序或重命名。 您必須編寫自己的代碼來執行此操作或使用外部工具。
JSON 沒有縮進,它只是結構化數據。 瀏覽器或其他工具可能會格式化 JSON,使其看起來不錯,但默認情況下它不存在。 它也不是 JSON 的一部分,因為格式只是它在屏幕上的外觀。 JSON 通常由其他代碼或服務處理,因此它們不關心縮進,只要數據結構正確即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.