2012-08-23 70 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 

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

它會給你的名字對象在第一排的班級