在Django中正确使用related_name

时间:2012-08-23 08:32:12

标签: python django

我有两个使用ForeignKey相关联的模型,并使用了related_name。这是一个例子。

class Student(models.Model):
    name = models.CharField(max_length=255)
    birthday = models.DateField(blank=True)


class Class(models.Model):

    name = models.CharField(max_length=255)
    student = models.ForeignKey(Student,
                                related_name='classes',
                                null=True)

    def __unicode__(self):
        return self.name

例如,我想访问类名。

这就是我的尝试。

john = Student.objects.get(username = 'john')
print john.classes.name

什么都没打印出来。

但是当我尝试john.classes

我得到django.db.models.fields.related.RelatedManager对象,地址为0x109911410。这表明它们是相关的。但我想得到班级名称。

我做错了吗?如何使用related_name访问类的名称?需要一些指导。

3 个答案:

答案 0 :(得分:18)

是的,班级是经理。一个老师可以是几个班级。所以要输出他们的名字,你应该这样做:

john = Student.objects.get(username = 'john')
for class2 in john.classes.all():
   print class2.name

如果您只想为一个学生开设一个班级,那么请使用一对一的关系。在这种情况下,您可以使用您的方法访问相关字段。

答案 1 :(得分:3)

请注意:您正在定义一对多的关系。因此,学生可能有多个类,因此john.classes.name无法工作,因为您尚未指定要具有该名称的类。在john.classes中,“classes”只是一个可以像任何其他Django Model Manager一样使用的管理器。你可以做一个john.classes.all()(比如sergzach propsed),还有像john.classes.get(...)或john.classes.filter(...)这样的东西。

答案 2 :(得分:1)

你可以这样做来访问表格中的第一行

john = Student.objects.get(username = 'john')    
john.classes.all().first().name # to access first row
john.classes.all().last().name # to access last row

在上面的示例中,您不想迭代对象

它将为您提供第一行中类的名称