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

Django DRF开发通讯APP出现int对象无conversation_id属性错误求解

问题原因与解决方案

报错根因

你遇到的AttributeError: 'int' object has no attribute 'conversation_id'错误,触发位置不在validate方法内部,而是在validate执行完成后的后续逻辑(序列化器的create/update方法,或响应数据序列化阶段)。

具体逻辑梳理

  • 初始版本运行正常的原因:你在validate方法中返回的是完整Conversation模型实例,DRF的外键关联字段(如PrimaryKeyRelatedField)会自动从实例中读取主键值返回给前端,存库时也支持直接传入模型实例作为外键关联值,整个流程符合DRF的默认处理规则。
  • 修改后报错的原因:你将validate返回值中conversation对应的内容从模型实例改成了int类型的conversation_id值,此时如果后续的create/update方法、或自定义的to_representation序列化逻辑中,仍然试图从这个字段中取conversation_id属性,就会触发int类型没有对应属性的报错。
  • sender.id可正常运行的原因:你在validate返回值中sender对应的内容仍然是完整的User模型实例,后续逻辑对实例取id属性自然不会报错。如果你同样把validate返回的sender改成sender.id的int值,后续再取sender.id也会触发同类报错。

修复方案

方案1(推荐,符合DRF最佳实践)

保持validate方法中返回完整Conversation实例的写法,不需要修改为ID值。DRF默认会自动处理实例到主键值的序列化输出,存库时也不需要额外转换,代码更简洁易维护。

方案2(确实需要返回ID值时使用)

如果你有业务场景必须在validate阶段就返回conversation_id的int值,需要同步修改两处逻辑:

  • 将SendMessageSerializer中conversation/conversation_id字段从关联字段改为IntegerField,不再绑定模型外键关联
  • 修改create/update方法,存库时直接使用返回的int值作为外键ID写入,不要对该字段再做属性读取,示例写法:
def create(self, validated_data):
    return Message.objects.create(
        conversation_id=validated_data.get("conversation_id"),
        sender_id=validated_data.get("sender").id,
        content=validated_data.get("content")
    )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:36:04