【问题标题】:Can I use a ForeignKey in __unicode__ return?我可以在 __unicode__ 返回中使用 ForeignKey 吗?
【发布时间】:2010-09-28 13:30:42
【问题描述】:

我有以下课程:成分、食谱和食谱内容...

class Ingredient(models.Model):
    name = models.CharField(max_length=30, primary_key=True)
    qty_on_stock = models.IntegerField()

    def __unicode__(self):
        return self.name

class Recipe(models.Model):
    name = models.CharField(max_length=30, primary_key=True)
    comments = models.TextField(blank=True)
    ingredient = models.ManyToManyField(Ingredient)

    def __unicode__(self):
        return self.name

class RecipeContent(models.Model):
    recipe = models.ForeignKey(Recipe)
    ingredients = models.ForeignKey(Ingredient)
    qty_used = models.IntegerField()

但是对于RecipeContent 中的__unicode__(),我想使用这个RecipeContent 所属的Recipe 名称...有没有办法做到这一点?

【问题讨论】:

  • 只是关于样式的注释,我建议您不要复数您的 ForeignKey 字段名称,因为它们一次只能指向一条记录。我指的是 RecipeContent 下的成分字段。

标签: python django django-models


【解决方案1】:

在 Python 3 中没有__unicode__,您需要使用__str__ 代替。

    class RecipeContent(models.Model):
        ...
        def __str__(self):
            return self.recipe.name

【讨论】:

    【解决方案2】:

    如果您只关心配方的名称部分,您可以这样做:

    class Recipe(models.Model):
        name = models.CharField(max_length=30, primary_key=True)
        comments = models.TextField(blank=True)
        ...
    
        def __unicode__(self):
            return self.name
    
    class RecipeContent(models.Model):
        recipe = models.ForeignKey(Recipe)
        ...
    
        def __unicode__(self):
            return str(self.recipe)
    

    【讨论】:

      【解决方案3】:

      是的,你可以(作为 bishanty 点),但要为__unicode__() 被调用但 FK 尚未设置的情况做好准备。我来过几次。

      【讨论】:

      • true... 但也许我可以使用类似“if self.recipe.name: return self.recipe.name”的方式来处理这个问题?
      【解决方案4】:
      class RecipeContent(models.Model):
        ...
        def __unicode__(self):
          # You can access ForeignKey properties through the field name!
          return self.recipe.name
      

      【讨论】:

      • 叹息...就是这么简单!说明我是个菜鸟……谢谢你的回答。
      • 使用 Django 1.6。我得到:“NoneType”对象没有属性“名称”。方法:def __unicode__(self):返回 self.instrument.name。并且:类 Instrument(models.Model):name = models.CharField(max_length=200)。在我称之为“unicode”的地方:instrument = models.ForeignKey(Instrument,null=True,blank=True)
      • 我也有这个。我很高兴当某些实例有这个而有些没有时会发生这种情况。我最终不得不冲洗。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2013-05-20
      • 2015-12-05
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      相关资源
      最近更新 更多