多对多的Field - Accessing属性

时间:2016-06-29 14:04:53

标签: python django django-models

我有这两个与ManyToManyField相关的模型:

class Bar(models.Model):
    name = models.CharField(max_length=25, blank=False)

class Foo(models.Model):

    bar = models.ManyToManyField(Bar, blank=True, related_name='bb')

    def __unicode__(self):
        return '%s' % self.bar.name

在管理页面中,我收到此错误:

Exception Type: AttributeError
Exception Value: 'ManyRelatedManager' object has no attribute 'name'

如何在 Foo 中访问 bar 的名称?我看到点符号无效。

1 个答案:

答案 0 :(得分:1)

简短回答:你不能。

答案很长:您的问题“如何访问Foo中的栏名”意味着给定的Foo实例始终只有一个且只有一个相关Bar(不是零,不是两个,不是四十二,只是一个,但你使用的是ManyToManyField,这意味着一个给定的Foo实例可以有零个,一个或任何(正)个数相关的Bar。在这种情况下,Foo.bar解析为查询集,而不是单个Bar实例,IOW

f = Foo() 
f.bar.all()

相当于

f = Foo() 
Bar.objects.filter(bb=f) # very weird related name FWIW

实际上在这种情况下,Foo.bar会更好地命名为Foo.bars(复数)。

如果您的目的是建立一对多的关系,其中每个Foo只有一个BarBar有多个Foo,那么您需要{{1}相反。