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
相关产品推荐
相关产品推荐

