【问题标题】:Django - How to link tablesDjango - 如何链接表
【发布时间】:2015-04-25 08:31:41
【问题描述】:

您好,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”创建的。

在此阶段的任何建议将不胜感激。非常感谢,艾伦。

【问题讨论】:

  • 我很确定这段代码是使用python manage.py inspectdb 创建的,如果是,请在您的问题中说明。
  • 您先生是个天才。我已按要求更新了问题。

标签: python mysql sql django


【解决方案1】:

model relationships

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.

【讨论】:

  • 感谢您的回复。你不仅回答了这个问题,而且你超越了。非常感谢,艾伦。
【解决方案2】:

我不确定这对Managed=False 是否有意义,但我认为在 Django 中这样做的合理方法是使用

home_team = models.ForeignKey('StraightRedFixture', db_column='fixtureid'))

然后只使用fixture.home_team 而不是手动进行查询。

【讨论】:

  • 对不起,我希望我能接受两个答案。我确实尝试过,但它不允许。很遗憾我不能给每个答案一个百分比。最让我印象深刻的一点是在 aumo answer 中,他正确地猜到了它是由 python manage.py inspectdb 的结果创建的。我会投票给你,但我还不能,因为我不被允许。我保证一有机会就会回来投票。
猜你喜欢
  • 2021-12-22
  • 2013-11-14
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2016-09-30
  • 2011-09-23
相关资源
最近更新 更多