2013-09-22 107 views
1

所以我學習Django和試圖只用Django的ORM函數來獲取值throught外鍵。我有兩個表:用戶表(默認的Django auth_user系統表)和學生表,其中包含student_id,user_id(FK)和nr_indeksu(這是一個包含學生具體信息的附加信息的數字)。Django的外鍵查詢集(加入)

class Student(models.Model): 
    user = models.ForeignKey(User) 
    nr_indeksu = models.BigIntegerField() 

    def __unicode__(self): 
     return unicode(self.user 

我想通過用戶模型獲取nr_indeksu。換句話說執行這個查詢(使用查詢集):

SELECT nr_indeksu FROM auth_user 
INNER JOIN courses_student on auth_user.id = courses_student.user_id; 

我一直在使用select_related()函數的嘗試:

u = User.objects.select_related().get(pk=2) 

,但是當我試圖訪問nr_indeksu:

u.nr_indeksu 

我得到了錯誤的用戶對象有沒有屬性(這是有道理的,因爲nr_indeksu是學生模型,但我不應該能夠從用戶獲取呢?)

回答

3

記住一個ForeignKey是一個一對多的關係:有每個學生的許多用戶。從用戶對象中,您可以通過執行user_obj.student_set.all()訪問相關學生。

0
s = Student.objects.get(user__id=2) 

s.nr_indeksu 
+0

的事情是我想從使用JOIN用戶模型和FK關係獲取nr_indeksu,你的回答是隻是簡單的選取從學生模型 – Malyo

+1

不,不是這樣的。 'user__id = 2'表示'從user_id = 2;'中選擇*。這就像一個子查詢。 – sachitad

+0

好吧,我知道了,謝謝 - 但我仍想從用戶對象 – Malyo

1

添加到丹尼爾的回答,您還可以使用related_names,現在當你做一個反向的外鍵查找,你需要寫: -

user_obj.student_set.all() 

然而,隨着related_name屬性,模型看起來像: -

class Student(models.Model): 
    user = models.ForeignKey(User, related_name='studentuser') 
    nr_indeksu = models.BigIntegerField() 

    def __unicode__(self): 
     return unicode(self.user 

然後反向查找,你需要寫: -

user_obj.studentuser.all() 

基本上,我的意思是說,如果您不想使用django使用的默認名稱(例如,形式爲<foreign_key_name>_set),則可以通過傳遞related_name屬性來提供自己的反向查找名稱。在你的情況下它是student_set