You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:15:09