【问题标题】:Django giving error when save JSON data in modelsDjango 在模型中保存 JSON 数据时出错
【发布时间】: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 的方式是好的。我以为你只会创建一个对象。

标签: python jquery json django django-models


【解决方案1】:

当您在字典中查找不存在的键的值时,通常会抛出 KeyError。您可以在查找之前提供默认值或检查键是否存在。

request.POST.get('billno', 'default_value')

有关使用默认值查询字典的更多信息,请参阅this helpful StackOverflow 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]
    • 那么我的数据发生了什么,为什么它现在不能连接到模型
    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 2021-10-13
    • 2016-07-07
    • 2017-10-16
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多