[英]Django - How to link tables
您好,stackoverflow小組,
我有以下兩個Django表:
class StraightredFixture(models.Model):
fixtureid = models.IntegerField(primary_key=True)
soccerseason = models.IntegerField(db_column='soccerSeason') # Field name made lowercase.
hometeamid = models.IntegerField()
awayteamid = models.IntegerField()
fixturedate = models.DateTimeField()
fixturestatus = models.CharField(max_length=24)
fixturematchday = models.IntegerField()
hometeamscore = models.IntegerField()
awayteamscore = models.IntegerField()
class Meta:
managed = False
db_table = 'straightred_fixture'
class StraightredTeam(models.Model):
teamid = models.IntegerField(primary_key=True)
teamname = models.CharField(max_length=36)
teamcode = models.CharField(max_length=5)
teamshortname = models.CharField(max_length=24)
class Meta:
managed = False
db_table = 'straightred_team'
在views.py中,我知道可以放置以下內容,並且可以正常運行:
def test(request):
fixture = StraightredFixture.objects.get(fixtureid=136697)
return render(request,'straightred/test.html',{'name':fixture.hometeamid})
如上所述,這一切都很好,但是我希望返回可在StraightredTeam模型中找到的hometeamid的團隊名稱。
經過一番環顧后,我被推向“ select_related”的方向,但是我不清楚如何在現有表中實現它,以及它是否是此類查詢的最有效方法。 感覺不錯。
請注意,此代碼是使用“ python manage.py inspectdb”創建的。
在此階段的任何建議將不勝感激。 非常感謝,艾倫。
我不確定Managed=False
是否有意義,但是我想在Django中這樣做的明智方法是
home_team = models.ForeignKey('StraightRedFixture', db_column='fixtureid'))
然后只使用fixture.home_team
而不是手動進行查詢。
請參閱模型關系 。
Django提供了特殊的模型字段來管理表關系。 滿足您需求的一個是ForeignKey 。
而不是聲明:
hometeamid = models.IntegerField()
awayteamid = models.IntegerField()
我猜這是python manage.py inspectdb
的結果,您需要聲明:
home_team = models.ForeignKey('<app_name>. StraightredTeam', db_column='hometeamid', related_name='home_fixtures')
away_team = models.ForeignKey('<app_name>. StraightredTeam', db_column='awayteamid', related_name='away_fixtures')
通過執行此操作,您將告訴Django ORM處理內部關系,這將使您能夠執行以下操作:
fixture = StraightredFixture.objects.get(fixtureid=some_fixture_id)
fixture.home_team # Returns the associated StraightredTeam instance.
team = StraightredTeam.objects.get(team_id=some_team_id)
team.home_fixtures.all() # Return all at home fixtures for that team.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.