2011-02-26 143 views
1

有沒有一種方法來控制Django中的json序列化?簡單的代碼下面將JSON返回序列化對象:django:控制json序列化

co = Collection.objects.all() 
c = serializers.serialize('json',co) 

的JSON將類似於此:

[ 
    { 
     "pk": 1, 
     "model": "picviewer.collection", 
     "fields": { 
      "urlName": "architecture", 
      "name": "\u0413\u043e\u0440\u043e\u0434 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430", 
      "sortOrder": 0 
     } 
    }, 
    { 
     "pk": 2, 
     "model": "picviewer.collection", 
     "fields": { 
      "urlName": "nature", 
      "name": "\u041f\u0440\u0438\u0440\u043e\u0434\u0430", 
      "sortOrder": 1 
     } 
    }, 
    { 
     "pk": 3, 
     "model": "picviewer.collection", 
     "fields": { 
      "urlName": "objects", 
      "name": "\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043d\u0430\u0442\u044e\u0440\u043c\u043e\u0440\u0442", 
      "sortOrder": 2 
     } 
    } 
] 

你可以看到它的序列化它的方式,你可以重新創建整個模型,你想在某個時候做到這一點 - 公平的,但對我的情況下,簡單的JS AJAX不太方便:我想把流量降到最低,讓整個事情變得更清晰。

我所做的是我創建的傳遞對象到上傳.json模板,該模板會做這樣的事情,產生「更好」 JSON輸出一個觀點:

[ 
{% if collections %} 
    {% for c in collections %} 
{"id": {{c.id}},"sortOrder": {{c.sortOrder}},"name": "{{c.name}}","urlName": "{{c.urlName}}"}{% if not forloop.last %},{% endif %} 
    {% endfor %} 
{% endif %} 
] 

這並不工作和輸出是更漂亮(?):

[ 
    { 
     "id": 1, 
     "sortOrder": 0, 
     "name": "Город и архитектура", 
     "urlName": "architecture" 
    }, 
    { 
     "id": 2, 
     "sortOrder": 1, 
     "name": "Природа", 
     "urlName": "nature" 
    }, 
    { 
     "id": 3, 
     "sortOrder": 2, 
     "name": "Объекты и натюрморт", 
     "urlName": "objects" 
    } 
] 

不過,我由快速困擾我的解決方案使用的模板(在加工過程和可能的性能影響一個額外的步驟),並會採取手工作業,以保持我將更新例如,該模型。

我在想json生成應該是模型的一部分(糾正我,如果我錯了),並與原生python-json和django實現,但無法計算如何使它剝離位不想要。

還有一件事 - 即使當我將其限制爲一組字段進行序列化時,它也會將id始終保留在元素容器之外,並將其作爲「pk」出現在元素容器之外。

回答

2

這真的很容易。簡單的例子:

from django.http import HttpResponse 
from django.utils import simplejson 

def simple_view(request): 
    response = {'string': "test", 
       'number': 42, 
       'array': [1, 2, 3], 
       'js_object': dict(foo="bar")} 
    return HttpResponse(simplejson.dumps(response), 
         mimetype="application/json") 

這種觀點將返回以下JSON相當於:

{"string": "test", 
"number": 42, 
"array": [1, 2, 3], 
"js_object": {foo: "bar"}} 

編輯:是的,阿薩夫拉維是正確的,你的模板可以噴出無效JSON。

+0

這適用於數組,但我不認爲Django模式可以通過這種方式進行序列化。 – abolotnov 2011-02-27 20:16:03

+0

我認爲他暗示你應該將模型對象中的字段複製到JSON序列化類型,如列表或字典中。 'obj = Collection.objects.get(pk = 1); simplejson.dumps(dict(urlName = obj.urlName,name = obj.name,sortOrder = obj.sortOder)'。但就像在[別人的回答](http://stackoverflow.com/questions/5129794/django- control-json-serialization/5130423#5130423),活塞可以爲你做這一步:) – Bluu 2011-02-28 00:12:42

+0

這或多或少地適用於某些手動預處理 - 某些模型字段不能由simplejson序列化,我必須將它們轉換到字符串:( – abolotnov 2011-03-02 19:12:04

2

我建議你使用the json library來編碼你的數據,而不是自己構建類似json的字符串。上面的代碼似乎沒有妥善處理轉義,首先。編寫自己的序列化程序並沒有太多好處(除了錯誤)。

0

不是自己寫任何東西,而是讓Piston完成將Django模型序列化爲JSON的工作。默認情況下,它只是序列化模型的字段,沒有元數據。而且您可以輕鬆列出要包含或排除哪些字段 - 甚至是相關字段。沒有額外的模板和很少的查看代碼。

+0

似乎不支持活塞 - 6個月前提交的最後一個代碼,問題似乎沒有得到回覆/解決。 – abolotnov 2011-03-02 11:43:19

+0

一般。我一直在內部的公司項目中使用它,以成功地完成您所需的任務,但是我曾經有過多次需要解決長時間的漏洞問題。或者,如果您想要新的熱點,請查看[Tastypie](https:// github。COM/toastdriven/Django的tastypie)。 – Bluu 2011-03-02 17:02:58

+0

有一個社區分支正在取得進展,批准jesper,活塞的作者。據說,你應該安裝許多關閉一些開放錯誤的分支。例如我的,http://bitbucket.org/wires/django-piston – wires 2011-04-26 22:09:43

0
def view(request): 
    m_all = list(model.objects.all().values()) 

    return HttpResponse(simplejson.dumps(m_all)) 

這應該解決問題。 使用values()和轉換爲列表應該產生你想要的結果。