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

Django剧本应用报错TypeError: __str__ returned non-string (type int) 技术求助

问题根源与解决方案

错误原因

你遇到的TypeError: __str__ returned non-string (type int)完全是因为Block模型的__str__方法写得有问题。

看你的代码:

def __str__(self):
    return self.type

这里的self.type存储的是你定义的BlockTypes对应的整数值(比如1代表HEADING),而Python的__str__方法要求必须返回字符串类型,当Django尝试将Block实例转换为字符串(比如在序列化API响应、admin后台显示,或者保存实例时的内部处理),就会触发这个错误。

修复方法

把Block模型的__str__方法改成返回字符串即可,最简单的方式是使用Django为choices字段自动生成的get_<field_name>_display()方法,它会返回选项对应的文本标签:

class Block(models.Model):
    # 其他代码保持不变
    def __str__(self):
        # 返回类型的文本名称,比如'HEADING'、'CHARACTER'
        return self.get_type_display()

如果你想让__str__返回更有信息量的内容,也可以结合文本内容:

def __str__(self):
    return f"{self.get_type_display()}: {self.text[:20]}..."

这样会显示类似DIALOGUE: Hello, how are y...的字符串,方便你在admin或日志里快速识别实例。

关于Screenplay模型的blocks字段

你完全不需要在Screenplay模型里手动添加blocks字段!因为你已经在Block模型中定义了ForeignKey到Screenplay,并且设置了related_name='blocks',Django会自动为每个Screenplay实例创建一个反向关联的blocks属性,用来获取关联的所有Block对象。你在API响应中看到的blocks字段,是Django REST Framework自动序列化这个反向关联的结果,这是正常且正确的。

额外验证

修复__str__方法后,重新启动服务器,再尝试POST添加Block数据,这个错误应该就会消失了。如果还有其他问题,可以检查你的API序列化器是否正确处理了blocks关联,但当前的核心问题肯定是__str__方法的返回值类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:02:36