2015-12-04 35 views
1

我有以下JSON作爲輸入從客戶端當輸入是json時,保存模型的最佳方法是什麼?

[ 
{'id': 0, 'name': 'Housing', 'value': 3}, 
{'id': 1, 'name': 'Bank', 'value': 8}, 
{'id': 2, 'name': 'Entertainment', 'value': 3} 
] 

它被分配到inputV_wc對象在我看來,像下面

查看:

def savemore(request): 
    if request.method == "POST": 
     data=json.loads(request.body.decode()) 
     inputV_wc = data['wc'] 
    else: 
     response_data = 'You have not saved any data!' 
     return HttpResponse(response_data, content_type="text/plain") 
    try: 
     if not inputV_wc: 
      test='' 
     else: 
      # WC - Insert wc again on each save rather update - time consuming 
      if js_wex.objects.filter(pid = request.session.get('pid')).exists(): 
       js_wex.objects.filter(pid=request.session.get('pid')).delete() 
      wc = js_wex(pid=request.session.get('pid'), wcname=inputV_wc[0]['name'],rating=inputV_wc[0]['value'],ordernum=inputV_wc[0]['id']) 
      wc.save() 
      wc = js_wex(pid=request.session.get('pid'), wcname=inputV_wc[1]['name'],rating=inputV_wc[1]['value'],ordernum=inputV_wc[1]['id']) 
      wc.save() 
      wc = js_wex(pid=request.session.get('pid'), wcname=inputV_wc[2]['name'],rating=inputV_wc[2]['value'],ordernum=inputV_wc[2]['id']) 
      wc.save() 
    except Exception as e: 
     response_data = 'Ouch! Something went wrong!'+str(e) 
    return HttpResponse(response_data, content_type="text/plain") 

目前,如果我輸入的JSON有5行,當然,上面的視圖失敗,索引超出範圍。 ,如果輸入json有2行,它再次失敗,缺少條目 - 模型不能保存。

我怎麼能寫我的看法,例如,如果JSON已經改變對象的數目一樣

輸入從一個用戶 -

[ 
{'id': 0, 'name': 'Housing', 'value': 3}, 
{'id': 1, 'name': 'Bank', 'value': 18}, 
{'id': 2, 'name': 'Housing1', 'value': 14}, 
{'id': 3, 'name': 'Bank1', 'value': 12} 
] 

可以 - 從其他用戶

[ 
{'id': 0, 'name': 'Housing', 'value': 14}, 
{'id': 1, 'name': 'Bank', 'value': 18} 
] 

輸入處理?

對於每個輸入,Json行可以從1到15最大。

我讀了關於使用** kwargs,處理類似的情況..但我無法弄清楚如何申請保存我的模型的各種json輸入。

回答

1

如果我理解正確的話,我覺得你只是想用一個for statement

for row in inputV_wc: 
    wc = js_wex(pid=request.session.get('pid'), wcname=row['name'], rating=row['value'], ordernum=row['id']) 
    wc.save() 

如果要插入一次所有對象的基礎上,你表現出你很可能使用bulk_create什麼:

rows = [] 
for row in inputV_wc: 
    wc = js_wex(pid=request.session.get('pid'), wcname=row['name'], rating=row['value'], ordernum=row['id']) 
    rows.append(wc) 

js_wex.objects.bulk_create(rows) 
+0

是賈斯汀,與for循環或手動版本,我們必須遍歷數據庫多次爲每一行..有沒有更好的方法來完成這一步嗎? (到DB) –

+0

偉大的問題。你可以使用'bulk_create'。看到我上面的更新。 –

+0

非常感謝Justin!我會試試這個 –

相關問題