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

