2016-03-20 60 views
0

我正在使用Django序列化程序將模型數據序列化爲JSON。
例如: - 我有一個模型(CHECKTYPE),其中包含一個字段「類型」。
現在'類型'包含逗號(,)分隔的項目,如'test,test1,test2'。Django序列化程序 - 添加/更新字段屬性值

我使用Django串行像的下方(view.py某處):

gettypes = CHECKTYPE.objects.all() 
mytypes = serializers.serialize("json", gettypes) 
return HttpResponse(mytypes, content_type="application/json") 

這將返回我JSON網頁上象下面這樣:

[{"model": "porttype.CHECKTYPE", "pk": "xyz00000005", "fields": {"types": "test, test1, test2"}}] 

現在在這裏我要在序列化數據之前操作字段屬性。
例如:如果我用逗號分隔「類型」,我想在字段'lasttype'中添加一個屬性,這將成爲列表的最後一個索引。

lasttype = types.split(',')[-1] 

所以最終的JSON響應應該是這樣的:

[{"model": "porttype.CHECKTYPE", "pk": "xyz00000005", "fields": {"types": "test, test1, test2", "lasttype":"test2"}}] 

我試圖做到這一點像之下,但它不工作:

gettypes = CHECKTYPE.objects.all() 
updated_types = [] 
for mtype in gettypes: 
    mtype.lasttype = mtype.types.split(',')[-1] 
    updated_types.append(mtype) 
mytypes = serializers.serialize("json", updated_types) 
return HttpResponse(mytypes, content_type="application/json") 

但是,這是行不通的。它給了我相同的JSON響應,並沒有顯示'lasttype'屬性。 請讓我知道是否有任何可能實現這一目標。

感謝,
沙善

回答

0

修改您發送的響應的最佳方式是通過加載JSON與dict然後修改的字典,然後再JSON轉儲數據的響應。

0

在序列化之前,應該修改字段,而不是在序列化之前修改字段。

import json 
mytypes = json.loads(serializers.serialize("json", gettypes)) 
updated_types = [] 
for mytype in mytypes: 
    last_type = mytype['fields']['types'].split(',')[-1] 
    mytype['fields']['lasttype'] = last_type 
    updated_types.append(mytype) 
return JsonResponse(updated_types) 

使用JsonResponse你可以不重新序列化dictlist直接JSON數據。

預期的數據應該是這樣的:

'[{"pk": "xyz00000005", "model": "porttype.CHECKTYPE", "fields": {"lasttype": " test2", "types": "test, test1, test2"}}]' 
+0

謝謝。這解決了我的問題(我需要在JsonResponse中添加safe = False來顯示列表)。 –

+0

如果您想要,您可以將答案標記爲已接受:) – v1k45