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 subscriptable request.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 数据时出错的主要内容,如果未能解决你的问题,请参考以下文章

Django:使用 JSON 数据创建和保存模型

在 iOS 中使用数组解析 JSON 时出错

在 javascript 中通过 django 模板检索 json 数据时出错,在参数列表后给出 Uncaught SyntaxError: missing )

使用 JSON 的 Django 导入向导

保存核心数据时出错

在火花簇scala中保存随机森林模型时出错