输入为json时保存模型的最佳方法是什么?

时间:2015-12-04 12:45:41

标签: python django django-views

我在json下面作为来自客户端的输入

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")

在我的视图中将它分配给inputV_wc对象,如下所示

查看:

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

目前,如果我的输入json有5行,那么上面的视图肯定会因Index超出范围而失败。 如果输入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} 
]

来自其他用户的输入 -

highlight: function ( element, errorClass, validClass ) {
    $('div.TempX>button').addClass( "btn-danger" );
    $('#Filter').addClass( "btn-danger" );
},
unhighlight: function ( element, errorClass, validClass ) {
    $('div.TempX>button').removeClass( "btn-danger" );
    $('#Filter').removeClass( "btn-danger" );
}

可以处理吗?

每个输入的Json行最多可以是1到15个。

我读到了关于使用** kwargs来处理类似的场景..但我无法弄清楚如何申请保存我的模型以获得各种json输入。

1 个答案:

答案 0 :(得分: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)
相关问题