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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:47:03