2015-12-04 34 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!我会试试这个 –

相关问题