【问题标题】:TypeError __str__ returned non-string (type int)TypeError __str__ 返回非字符串(int 类型)
【发布时间】:2022-01-31 00:51:54
【问题描述】:

我正在尝试编写一个剧本应用程序,但是当我实际向我的模型添加信息时遇到了问题。我的模型如下所示:

class Screenplay(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=100)
   
    def __str__(self):
        return self.title

class Block(models.Model):
    class BlockTypes(models.IntegerChoices):
        HEADING = 1, 'HEADING'
        DESCRIPTION = 2, 'DESCRIPTION'
        CHARACTER = 3, 'CHARACTER'
        DIALOGUE = 4, 'DIALOGUE' 

    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    text = models.TextField()
    type = models.PositiveSmallIntegerField(
        choices=BlockTypes.choices,
        default=BlockTypes.HEADING
    )
    screenplay = models.ForeignKey(Screenplay, on_delete=models.CASCADE, related_name='blocks')
    
    def __str__(self):
        return self.type

当我转到我的后端 api (localhost:8000/api/screenplays) 时,我看到我的示例剧本如下:

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "uuid": "SAMPLE - UUID",
        "title": "SAMPLE - TITLE",
        "blocks": []
    },
]

我在标题中发布的错误是在我实际向剧本添加块时弹出的。在我的 api 中,它看起来像 "blocks": [],但是当我将一个块发布到某个剧本时,它会中断。我只是不明白问题到底是什么,如果它是在我的 models.py 中还是在我的 django 应用程序的其他部分中。我需要在我的剧本模型中添加一个块吗?无论如何,在这一点上,任何建议都会很棒。

【问题讨论】:

    标签: python django api django-models django-rest-framework


    【解决方案1】:

    __str__ 必须返回 string 并且您返回整数,即 PositiveSmallIntegerField。 将该值转换为 string 在您的 Block 模型中为

    def __str__(self):
        return str(self.type)
    

    更多详情请关注str[Django-doc]

    【讨论】:

    • 准确地说:__str__必须返回一个字符串; Python 不会从它返回的任何内容中自动创建一个字符串。 (这就是__str__ 的全部;定义如何将self 转换为str 类型的值。)
    • 更新了我的答案@chepner 先生。
    • @user8193706 如果我返回 self.type 以外的其他内容,这也能解决问题吗?因为现在当我添加一个块时,我看到 blocks: ['UUID'] 而不是看到块文本会更有帮助
    • 是的,您可以添加模型的other 字段,甚至还可以添加ForeignKey 参考模型的字段,但如果该字段不是string,您必须将其转换为字符串并返回跨度>
    猜你喜欢
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2020-07-14
    • 2015-03-01
    相关资源
    最近更新 更多