Django 在模型中保存 JSON 数据时出错
Posted
技术标签:
【中文标题】Django 在模型中保存 JSON 数据时出错【英文标题】:Django giving error when save JSON data in models 【发布时间】:2019-03-29 18:48:01 【问题描述】:我尝试使用此代码将我的 JSON 数据保存到我的模型 Mvouchar。但是得到这个错误。我很容易通过 cmd 获取数据,但我试图将其保存在我的模型中,然后我得到了错误,为什么会发生这种情况,我认为我犯了一些小错误但无法捕捉到,如果你遇到我的问题,请帮忙
#views.py
@csrf_exempt
def jsdata(request):
table_data = json.loads(request.POST.get('MyData'))
print(table_data)
for data in table_data:
b_no = request.POST['billno']
b_details = request.POST['billdetails']
at = request.POST['amount2']
record = Mvouchar(bill_no = data.b_no, bill_details = data.b_details,am=data.at)
record.save()
return render(request, 'cheque/mvouchar.html', 'msg': 'Data Saved.')
#models.py
class Mvouchar(models.Model):
related = models.ForeignKey(Signs, on_delete=models.CASCADE, null=True, blank=True)
bill_no = models.CharField(max_length=80, null=True, blank=True)
bill_details = models.CharField(max_length=1000, null=True, blank=True)
am = models.CharField(max_length=30, null=True, blank=True)
vouchar_no = models.CharField(max_length=1000, null=True, blank=True)
#urls.py
url(r'jsondata/$', views.jsdata, name='jsondata'),
#script
<script>
$("#btnjson").click(function ()
var array1 = [];
$("tbody tr").each(function ()
var firstTableData = ;
firstTableData.BillNo = $(this).find('td').eq(0).text();
firstTableData.BillDetails = $(this).find('td').eq(1).text();
firstTableData.Amount = $(this).find('td').eq(2).text();
array1.push(firstTableData);
//
);
alert(JSON.stringify(array1));
$.ajax(
type: "POST",
url: "/jsondata/",
dataType: 'json',
data: MyData: JSON.stringify(array1),
success: function(msg)
alert(msg);
);
return false;
);
);
</script>
【问题讨论】:
您能否发布正在控制台中打印的table_data
。
当请求数据中不存在key时,可能会发生此错误。
现在请看我的问题,我用 print table_data 插入图像
从您的 ajax 中,您只发送一个包含您的 json 字符串的数组 MyData。您希望如何在您的视图中获得request.POST['billno']
。它不存在,您从未发送过它。我认为在你的 ajax 中你应该发布data: JSON.stringify(array1)
,没有必要将 json 放在另一个对象中。
nvm 我看到你正在发送一个数组来创建多个对象,所以你发送 json 的方式是好的。我以为你只会创建一个对象。
【参考方案1】:
当您在字典中查找不存在的键的值时,通常会抛出 KeyError
。您可以在查找之前提供默认值或检查键是否存在。
request.POST.get('billno', 'default_value')
有关使用默认值查询字典的更多信息,请参阅this helpful *** answer
上面的代码行不能正常工作,因为除了小写字母不存在的键之外,此代码中还有其他问题(见下文)。
查看代码,我预计密钥不存在,因为尚未发送或,因为它可能包含大写字母。
正如您在 cmets 中对您的问题所指出的那样,您不仅要查询 billno
(仅小写字母),而您发送的密钥具有大写字母(BillNo
),而且您还将其嵌入到另一个字典 MyData
- 您需要将查询从 request.POST['billno']
更改为 data['BillNo']
(您尝试提取的所有其他值也是如此)。
因此,正确的查询应如下所示:
for data in table_data:
b_no = data['BillNo']
b_details = data['BillDetails']
at = data['Amount']
record = Mvouchar(bill_no = b_no, bill_details = b_details,am=at)
record.save()
【讨论】:
【参考方案2】:当请求数据中不存在密钥时,可能会发生此错误。通过改变
b_no = request.POST['billno']
到
b_no = request.POST.get('BillNo')
.
解决抛出这个异常。即使数据不存在,它也会返回 None。或者可以通过添加 try.except 块来处理。
try:
b_no = request.POST['billno']
except KeyError:
pass
并且在您的代码中,您将每个 dict 键以小写形式调用,将金额键称为 amount2。将其更改为金额
【讨论】:
现在它给了我 typeError: method 'object' is not subscriptablerequest.POST.get
是一个方法,它需要括号()
而不是方括号[]
。
这也没有考虑到密钥不是在request.POST
中发送,而是在密钥request.POST['Mydata']
内的列表中的字典中发送...【参考方案3】:
如果您将数据存储在 table_data
(table_data = request.POST.get('MyData')
) 中,则使用 table_data
将其存储在模型中。
您的数据是字典形式,因此需要通过其键调用值。 喜欢 -
@csrf_exempt
def jsdata(request):
table_data = json.loads(request.POST.get('MyData'))
print(table_data)
for data in table_data:
b_no = data.get('BillNo')
b_details = data.get('BillDetails')
at = data.get('Amount')
record = Mvouchar(bill_no = b_no , bill_details = b_details ,am=at )
record.save()
return render(request, 'cheque/mvouchar.html', 'msg': 'Data Saved.')
试试这个,如果发生任何错误告诉我。
【讨论】:
嘿@PankajSharma 现在也收到错误请检查更新问题中的跟踪 @monikachoudhary 我不明白哪个是当前错误跟踪以及您在 views.py 中做了哪些更新 您在哪个属性中遇到错误?也可以针对此错误发布新问题【参考方案4】:from django.http import JsonResponse
def jsdata(request):
table_data = json.loads(request.POST.get('MyData'))
# print(table_data)
r_data =
'success': True,
for data in table_data:
# Since you are just creating objects you don't need to save created object in a variable.
try:
Mvouchar.objects.create(bill_no = data['BillNo'], bill_details=data['BillDetails'],at=data['Amount'])
except:
r_data['success'] = False
# IMO Views responding to ajax requests should send JsonResponse
if r_data['success']:
r_data['msg'] = 'Data Saved'
else:
r_data['msg'] = 'Not all Data Saved'
return JsonResponse(r_data)
【讨论】:
嘿,现在没有显示任何错误,我将修复,但仍然没有在我的模型中保存条目 请查看有问题的图像现在没有错误,但在提交数据时没有提交到我的字段 我在第一个警报中有两个警报有我的数据,但在第二个警报中它显示 [object Object] 那么我的数据发生了什么,为什么它现在不能连接到模型 让我们continue this discussion in chat.以上是关于Django 在模型中保存 JSON 数据时出错的主要内容,如果未能解决你的问题,请参考以下文章
在 javascript 中通过 django 模板检索 json 数据时出错,在参数列表后给出 Uncaught SyntaxError: missing )