2012-08-23 66 views
20

我有两个使用ForeignKey关联在一起的模型,并且使用related_name。这是一个例子。在Django中正确使用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访问类的名称?需要一些指导。

回答

18

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

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

如果你只想要一个学生一个班,然后使用一对一的关系。在这种情况下,您可以使用您的方法访问相关字段。

+0

每个孩子只有一个班级。那么为什么不john.classes.name? – lakesh

+0

你的解决方案的工作原理,但想知道为什么john.classes.name不工作? – lakesh

+0

因为ForeignKey为一个孩子创建了几个类,而不是一个类。如果你只想要一个类使用onetoone字段。 – sergzach

3

请注意:您正在定义一对多关系。因此,学生可以有多个类,因此john.classes.name不能工作,因为你没有指定你想要名称的类。在john.classes中,“classes”只是一个管理器,您可以像任何其他Django Model Manager一样使用它。你可以做一个john.classes.all()(比如sergzach提供),但也可以是john.classes.get(...)或john.classes.filter(...)。

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 

在上面的例子中,你不想遍历

它会给你的名字对象在第一排的班级