2013-08-30 74 views
0

我遇到的問題是將使用django.core.serializers的序列化Django模型與其他一些數據混合,然後嘗試使用json.dumps序列化整個事物。如何將JSON序列化的Django模型與平JSON混合

示例代碼:

scores = [] 
for indicator in indicators: 
    score_data = {} 
    score_data["indicator"] = serializers.serialize("json", [indicator,]) 
    score_data["score"] = evaluation.indicator_percent_score(indicator.id) 
    score_data["score_descriptor"] = \ 
     serializers.serialize("json", 
      [form.getDescriptorByPercent(score_data["score"]),], 
      fields=("order", "value", "title")) 
    scores.append(score_data) 
scores = json.dumps(scores) 

return HttpResponse(scores) 

它返回這樣的對象列表:

{ 
    indicator: "{"pk": 345345, "model": "forms.indicator", "fields": {"order": 1, "description": "Blah description.", "elements": [10933, 4535], "title": "Blah Title"}}", 
    score: 37.5, 
    score_descriptor: "{"pk": 66666, "model": "forms.descriptor", "fields": {"order": 1, "value": "1.00", "title": "Unsatisfactory"}}" 
} 

我有問題可以在JSON中可以看出與序列化Django模型被包裹在多套報價。這使得它很難與客戶端上的工作,當我嘗試做一些像

indicator.fields.order 

,因爲瀏覽器認爲我處理一些類型的字符串它的計算結果不了了之。

理想情況下,我希望有效的JSON沒有使其不可讀的衝突引號。一些類似於這樣的對象的列表:

{ 
    indicator: { 
     pk: 12931231, 
     fields: { 
      order: 1, 
      title: "Blah Title", 
     } 
    }, 
    etc. 
} 

我應該以不同的順序使用不同的數據結構,這樣,不同的串行器?

回答

1

我的解決方案涉及刪除使用django.core.serializers而不是使用django.forms.model_to_dictdjango.core.serializers.json.DjangoJSONEncoder

生成的代碼是這樣的:

for indicator in indicators: 
    score_data = {} 
    score_data["indicator"] = model_to_dict(indicator) 
    score_data["score"] = evaluation.indicator_percent_score(indicator.id) 
    score_data["score_descriptor"] = \ 
     model_to_dict(form.getDescriptorByPercent(score_data["score"]), 
      fields=("order", "value", "title")) 

    scores.append(score_data) 
scores = json.dumps(scores, cls=DjangoJSONEncoder) 

的問題似乎從事實,我基本上序列化Django模型兩次出現。一旦使用了django.core.serializers函數,並且使用了json.dumps函數。

該解決方案通過先將模型轉換爲字典,然後將其與其他數據一起放入字典中,然後使用json.dumps使用DjangoJSONEncoder對其進行序列化來解決此問題。

希望這可以幫助別人,因爲我找不到我的具體問題,但能夠使用其他stackoverflow帖子的其他答案拼湊在一起。

相關問題