首页 > 解决方案 > 在 Django 模型的 __str__ 方法中引用 ManyToManyField

问题描述

在 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]

代码的最后一行

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

产生错误:“ManyRelatedManager”对象没有属性“代码”。我使用 Python 3.6 和 Django 2.2.2

标签: djangopython-3.xdjango-models

解决方案


你可以这样做:

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]

有关多对多用法的更多信息,请查看documentation.


推荐阅读