在Django模型的__str__方法中引用ManyToManyField

时间:2019-06-11 09:42:32

标签: django python-3.x django-models

在Django模型的 str 方法中,我试图引用一个字段ManyToManyField。

class Level(models.Model):
    code            = models.CharField(max_length=10)
    name            = models.CharField(max_length=60)

    def __str__(self):
        return self.code

class Excercise(models.Model):
    title           = models.CharField(max_length=100, unique=True)
    level           = models.ManyToManyField(Level)

    def __str__(self):
        return self.level.code + ') ' + self.title[:20]

代码的最后一行

  

返回self.level.code +')'+ self.title [:20]

产生错误:'ManyRelatedManager'对象没有属性'code'。 我使用Python 3.6和Django 2.2.2

1 个答案:

答案 0 :(得分:1)

您可以这样做:

class Excercise(models.Model):
    title           = models.CharField(max_length=100, unique=True)
    level           = models.ManyToManyField(Level)

    def __str__(self):
        return '({}) {}'.format(', '.join(self.level.all().values_list('code', flat=True)), self.title[:20])

因为,您可以使用.all()访问关卡对象。

或者,如果您只想访问第一个对象,则可以这样使用:

    def __str__(self):
        elevel = self.level.all().first()
        if elevel:
           return elevel.code + ')' + self.title[:20]
        return self.title[:20]

有关ManyToMany用法的更多信息,请检查documentation