通过AJAX向Django后端提交数据时出现查询不存在错误求助
排查Django AJAX提交时「Advice matching query does not exist」错误
嘿,这个问题我之前帮不少开发者排查过,核心原因基本都是后端查询逻辑和前端传参不匹配,咱们一步步拆解解决:
1. 先定位错误根源:Django的get()方法抛出异常
你看到的这个错误,本质是Django里用Advice.objects.get(...)查询时,找不到符合条件的对象。哪怕数据库里有这条记录,只要查询条件不对,就会触发这个异常。
2. 第一步:检查后端实际收到的参数
先在你的saveData视图函数里加一行打印,看看前端传过来的ansId到底是什么:
def saveData(request): if request.method == 'POST': # 打印所有POST参数,确认ansId的数值和类型 print("Received POST data:", request.POST) # 后续逻辑...
比如如果前端传的ansId是字符串(比如"123"),但数据库里Advice的id是整数类型,虽然Django通常会自动转换,但有时候也会出问题,这时候可以手动转成整数:
ans_id = int(request.POST.get('ansId'))
3. 第二步:替换get()为更安全的查询方式
直接用get()太容易抛出异常,建议换成get_object_or_404或者先判断查询集是否存在:
方式一:用get_object_or_404(推荐)
from django.shortcuts import get_object_or_404 def saveData(request): if request.method == 'POST': ans_id = request.POST.get('ansId') # 如果找不到,会返回404,同时控制台会输出更清晰的日志 advice = get_object_or_404(Advice, id=ans_id) # 后续处理逻辑... return JsonResponse({'status': 'success'})
方式二:先判断查询集是否存在
def saveData(request): if request.method == 'POST': ans_id = request.POST.get('ansId') advice_qs = Advice.objects.filter(id=ans_id) if not advice_qs.exists(): # 明确返回错误信息给前端 return JsonResponse({'error': 'Advice not found with this ID'}, status=404) advice = advice_qs.first() # 后续逻辑...
4. 第三步:确认前端传的ansId是否正确
在AJAX请求前,先打印一下data.ansId的值,确保它和数据库里Advice记录的id完全一致:
console.log("ansId being sent:", data.ansId); // 检查这个值是不是数据库里存在的ID $.ajax({ type: 'POST', url: '{% url "recsystem:saveData" %}', data: { 'csrfmiddlewaretoken' : "{{ csrf_token }}", 'ansId' : data.ansId, 'queTitle': data.queTitle, 'queText' : data.queText, 'desc': data.desc, 'optionType': data.optionType, 'anstextArray': data.anstextArray }, // 其他配置... });
5. 额外排查点:数据库事务或缓存问题
如果以上都没问题,那可以确认下数据库里的记录是否真的提交了:
- 用Django Shell执行查询:
python manage.py shell,然后输入from yourapp.models import Advice; Advice.objects.filter(id=你的ansId).exists(),看看返回True还是False。 - 如果是刚添加的记录,确认有没有未提交的事务(比如在视图里用了
transaction.atomic()但没提交)。
内容的提问来源于stack exchange,提问作者Farhan Habib
相关产品推荐
相关产品推荐

