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

Django中Athletes双FK关联Parents表更新时ValueError报错求助

问题解决:Django外键赋值报错ValueError

错误原因

你遇到的Cannot assign "'1'": "Athletes.parent_1" must be a "Parents" instance错误,本质是直接给外键字段parent_1/parent_2赋值了字符串类型的ID值,而Django的外键字段默认要求赋值对应的模型实例,而非原始ID。

两种修复方案

方案1:使用外键的_id后缀字段赋值

Django会自动为每个外键字段生成字段名_id属性,用于直接设置ID值。修改视图代码,将赋值逻辑改为:

athlete.parent_1_id = request.POST.get('parent_1')
athlete.parent_2_id = request.POST.get('parent_2')

这种方式可直接传入ID(字符串或数字类型均可,Django会自动处理类型转换),无需提前查询Parents实例。

方案2:先查询Parents实例再赋值

如果需要验证家长ID的有效性,可以先通过ID查询对应的Parents对象,再赋值给外键字段:

from django.shortcuts import get_object_or_404

parent1 = get_object_or_404(Parents, id=request.POST.get('parent_1'))
parent2 = get_object_or_404(Parents, id=request.POST.get('parent_2'))

athlete.parent_1 = parent1
athlete.parent_2 = parent2

该方式的优势是,若ID不存在会直接返回404响应,避免无效数据写入。

额外建议

如果使用Django表单处理数据,推荐直接使用ModelForm,它会自动处理外键ID到实例的转换,无需手动操作:

from django import forms
from .models import Athletes

class AthleteForm(forms.ModelForm):
    class Meta:
        model = Athletes
        fields = ['reg_number', 'first_name', 'last_name', 'gender', 'age_group', 'parent_1', 'parent_2']

在视图中直接用这个表单接收POST数据,表单会自动完成验证和外键转换工作。

内容的提问来源于stack exchange,提问作者SteveM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:06:07