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

