2014-01-06 19 views
0

我有兩張表格,School和Scores,它們有一個共同的'psid'列。我將每個表格中的數據導入到我的應用程序中。我想通過一個ForeignKey將兩個表連接在一起(一個學校可以有多個分數)。用於導入表格數據的Django ForeignKey

目前我models.py看起來是這樣的:

class School(models.Model): 
    psid = models.CharField(primary_key=True, max_length=5) 
    city = models.CharField(max_length=100) 

class Score(models.Model): 
    psid = models.ForeignKey(School, max_length=5, db_column='psid') 
    scores = models.IntegerField(max_length=2) 

我需要在分數的附加字段,這樣我既可以導入從原始表的PSID列,並已鏈接得分一個ForeignKey字段,通過'psid'專欄一起學校?

任何幫助表示讚賞。

+0

我很困惑,你想獲取相關的學校對象psid值或爲每個與psid列無關的每個Score對象命名爲psid的另一個獨立字段(btw類名稱不應該是複數形式)? – yuvi

+0

你好,是分數應該是單數。我編輯了這個問題來解決這個問題。我的目標是能夠用psid值獲取學校對象。在我的模板中,我展示了每所學校的分數。 – wsvincent

+0

你爲什麼認爲你需要另一個領域? –

回答

1

django模型處理大多數情況下在幕後鏈接表格。 ForeignKey字段類型足以實現此目的,那麼您只需使用ORM在查詢中加入表。這是我怎麼會設置您的表基於我最好的解讀一下你正在尋找:

from django.db import models 


class School(models.Model): 
    psid = models.CharField(primary_key=True, max_length=5) 
    city = models.CharField(max_length=100) 

    def __unicode__(self): 
     return u"{0} ({1})".format(self.psid, self.city) 


class Score(models.Model): 
    school = models.ForeignKey(School, null=False, db_column="psid") 
    score = models.IntegerField() 

    def __unicode__(sefl): 
     return u"Score({0}, {1})".format(self.school.psid, self.score) 

然後以測試你的模型了:

$ ./manage.py syncdb 
$ ./manage.py shell 
>>> from schools.models import School, Score 
>>> school1 = School(psid="S1", city="Springfield") 
>>> school1 
S1 (Springfield) 
>>> school1.save() 
>>> School.objects.get(psid="S1") 
S1 (Springfield) 
>>> school2 = School(psid="S2", city="Springfield") 
>>> school2.save() 
>>> score1 = Score(school=school1, score=3) 
>>> score1 
Score(S1, 3) 
>>> score1.school.psid 
S1 
>>> score2 = Score(school=school1, score=2) 
>>> score3 = Score(school=school2, score=5) 
>>> score1.save() 
>>> score2.save() 
>>> score3.save() 
>>> school1.score_set.all() 
[Score(S1, 3), Score(S1, 2)] 
>>> school2.score_set.all() 
[Score(S2, 5)] 
>>> Score.objects.all() 
[Score(S1, 3), Score(S1, 2), Score(S2, 5)] 
>>> Score.objects.filter(school__psid="S1") 
[Score(S1, 3), Score(S1, 2)] 

我希望可以幫助你。

+0

這是非常有幫助的。我多次通過shell代碼工作,併爲我鞏固了一些東西。希望它也適用於其他人。 – wsvincent

+0

出於某種原因,當我批量導入兩個表的數據時,我並不是「相信」ForeignKey會工作,而且我自己也不習慣按照您演示的方式執行shell。所以我認爲我仍然需要在兩張表中都有'psid'。按照您的建議(和Django文檔建議)簡單地將'psid'設置爲'score'即可。再次感謝您抽出時間來闡明這一點。 – wsvincent