Django中向外键表POST提交数据失败问题求助
解决方案
核心错误出现在视图层外键字段的赋值逻辑,Django对外键字段有固定的赋值规则,按以下方法修正即可:
- 你在Item模型中定义的
cId是关联Category表的外键字段,直接给该字段赋值时必须传入Category表的实例对象,不能直接传入分类的主键值 - 从
request.POST中取出的所有参数默认是字符串类型,而分类主键是整数类型,需要先做类型转换 - 如果不想额外查询Category实例,可以直接给Django自动生成的
外键字段名_id属性赋值主键值,性能更高
修正后的两种写法(二选一即可)
写法1:先查询关联分类实例再赋值(推荐,自带非法ID校验)
def send(request): if request.method == "POST": a = request.POST.get("a") b = request.POST.get("b") # 转换主键格式+校验分类是否存在 try: category = Category.objects.get(cId=int(b)) except Category.DoesNotExist: return HttpResponse("提交的分类ID不存在,请检查后重试") # 外键字段传入分类实例 item = Item(itemName=a, cId=category) item.save() return HttpResponse("sent") else: return HttpResponse("form submission failed")
写法2:直接给主键属性赋值(无需额外查询)
def send(request): if request.method == "POST": a = request.POST.get("a") b = request.POST.get("b") # 直接给自动生成的cId_id属性赋值整数类型的主键 item = Item(itemName=a, cId_id=int(b)) item.save() return HttpResponse("sent") else: return HttpResponse("form submission failed")
额外优化建议
- Django模型字段官方推荐使用蛇形命名法,比如把
categoryName改成category_name、cId改成category,代码可读性会更高 - 可以使用Django自带的表单组件(ModelForm)自动做参数校验、外键关联逻辑,减少手动编码出错概率
内容的提问来源于stack exchange,提问作者Hasnain
相关产品推荐
相关产品推荐

