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

Django模型__str__返回非字符串(Bottle)报错的原因与修复

Django Admin操作Ingredient报错的修复方案

错误原因

你的Ingredient模型的__str__方法存在问题:当ingredient_rhum字段有值时,你直接返回了Bottle对象,而非字符串类型。尽管Bottle模型的__str__会返回字符串,但Django Admin的内部逻辑要求模型的__str__方法必须直接返回字符串,不能返回对象实例,这就导致了__str__ returned non-string (type Bottle)错误。

修复方法

修改Ingredient模型的__str__方法,确保无论哪种情况都返回字符串:

方案一:利用Bottle的__str__转换为字符串

class Ingredient(models.Model):
    drink = models.ForeignKey(DrinkRecipe, on_delete=models.CASCADE)
    ingredient_rhum = models.ForeignKey(Bottle, on_delete=models.CASCADE, null=True, blank=True)
    ingredient_name = models.CharField(max_length=255, blank=True)
    ingredient_amount = models.DecimalField(decimal_places=1,max_digits=5, validators=[MinValueValidator(0.01)])
    

    def __str__(self):
        if self.ingredient_rhum:
            return str(self.ingredient_rhum)  # 显式转换为字符串
        return self.ingredient_name
        
    def get_absolute_url(self):
        return self.drink.get_absolute_url()

方案二:直接返回Bottle的名称字段

如果你想更直接地控制返回内容,可以直接调用Bottle的bottle_name字段:

def __str__(self):
    if self.ingredient_rhum:
        return self.ingredient_rhum.bottle_name
    return self.ingredient_name

为什么CreateView没有报错?

CreateView在渲染页面时,会隐式对对象调用str()进行转换,所以不会触发错误;但Admin的内部处理逻辑更严格,要求__str__方法必须直接返回字符串类型,因此暴露了这个问题。

内容的提问来源于stack exchange,提问作者Thomas Doll-Datema

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:47:20