Django中Prevision模型创建时报TypeError的问题求助
问题解决建议
1. 修复pre_save信号的查询逻辑
核心问题出在comprobar_ano_prevision信号处理函数中——你错误地将外键实例当作id参数传入查询。Django的get(id=...)要求传入数字类型的ID值,但你传了instance.Representada(这是一个Representada对象),因此触发TypeError。
修改信号函数的查询代码:
@receiver(pre_save, sender=Prevision) def comprobar_ano_prevision(sender, instance, **kwargs): # 错误写法:Representada.objects.get(id=instance.Representada) # 正确写法:使用外键实例的id属性 representada = Representada.objects.get(id=instance.Representada.id) # 若无需重新查询实例,直接使用已关联的对象即可(更高效) # representada = instance.Representada # ... 后续逻辑
2. 正确创建Prevision实例的两种方式
Django外键字段要求传入对应模型的实例,或通过_id后缀直接传入ID值:
- 方式一:通过实例创建
# 先获取已存在的供应商和客户实例 representada = Representada.objects.get(pk=你的供应商ID) cliente = Cliente.objects.get(pk=你的客户ID) # 创建预测记录 prevision = Prevision( Representada=representada, Cliente=cliente, Ano=2024, # 其他字段... ) prevision.save() - 方式二:通过_id后缀传ID
若不想提前查询实例,可直接用外键字段的_id后缀传入数字ID:prevision = Prevision( Representada_id=1, # 替换为实际供应商ID Cliente_id=2, # 替换为实际客户ID Ano=2024, # 其他字段... ) prevision.save()
错误原因说明
- TypeError:信号中把Representada实例传给了
id参数,Django期望数字类型的ID,却收到了对象。 - ValueError:直接给外键字段传ID字符串/数字,Django要求传入对应模型的实例;若要传ID,必须使用
字段名_id的格式。
内容的提问来源于stack exchange,提问作者grover999
相关产品推荐
相关产品推荐

