Django 更新 MySQL 涉及外键的数据库问题

Django update MySQL database issue involving foreign keys

大家早上好,

我有以下两个模型:

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class StraightredTeam(models.Model):
    teamid = models.IntegerField(primary_key=True)
    teamname = models.CharField(max_length=36)
    country = models.CharField(max_length=36,null=True)
    stadium = models.CharField(max_length=36,null=True)
    homepageurl = models.CharField(max_length=36,null=True)
    wikilink = models.CharField(max_length=36,null=True)
    teamcode = models.CharField(max_length=5,null=True)
    teamshortname = models.CharField(max_length=24,null=True)
    currentteam = models.PositiveSmallIntegerField(null=True)

    def natural_key(self):
        return self.teamname

    class Meta:
        managed = True
        db_table = 'straightred_team'

class StraightredFixture(models.Model):
    fixtureid = models.IntegerField(primary_key=True)
    home_team = models.ForeignKey('straightred.StraightredTeam', db_column='hometeamid', related_name='home_fixtures')
    away_team = models.ForeignKey('straightred.StraightredTeam', db_column='awayteamid', related_name='away_fixtures')
    fixturedate = models.DateTimeField(null=True)
    fixturestatus = models.CharField(max_length=24,null=True)
    fixturematchday = models.IntegerField(null=True)
    spectators = models.IntegerField(null=True)
    hometeamscore = models.IntegerField(null=True)
    awayteamscore = models.IntegerField(null=True)
    homegoaldetails = models.TextField(null=True)
    awaygoaldetails = models.TextField(null=True)
    hometeamyellowcarddetails = models.TextField(null=True)
    awayteamyellowcarddetails = models.TextField(null=True)

    class Meta:
        managed = True
        db_table = 'straightred_fixture'

以下视图完美运行:

@csrf_exempt
def updateteams(request):

    if request.user.is_authenticated():

        xmlsoccer = XmlSoccer(api_key='XYZ', use_demo=True)
        teams = xmlsoccer.call_api(method='GetAllTeams')

        numberOfTeamsUpdated = 0

        for team in teams:

            if 'Team_Id' in team.keys():
                teamUpdate = StraightredTeam(teamid=team['Team_Id'],teamname=team['Name'],stadium=team['Stadium'])
                teamUpdate.save()
                numberOfTeamsUpdated = numberOfTeamsUpdated + 1

        return HttpResponse(str(numberOfTeamsUpdated) + " team/s have been added/updated.")

    else:
        return HttpResponse("You must be logged in to update teams.")

但是,以下视图不起作用:

@csrf_exempt
def updatefixtures(request):

    if request.user.is_authenticated():

        xmlsoccer = XmlSoccer(api_key='XYZ', use_demo=True)
        fixtures = xmlsoccer.call_api(method='GetFixturesByLeagueAndSeason',
                                   seasonDateString='1516',
                                   league='Scottish Premier League')

        numberOfFixturesUpdated = 0

        for fixture in fixtures:

            if 'Id' in fixture.keys():
                fixtureUpdate = StraightredFixture(fixtureid=fixture['Id'],away_team=fixture['AwayTeam_Id'],home_team=fixture['HomeTeam_Id'])
                fixtureUpdate.save()
                numberOfFixturesUpdated = numberOfFixturesUpdated + 1

        return HttpResponse(str(numberOfFixturesUpdated) + " fixture/s have been added/updated.")

    else:
        return HttpResponse("You must be logged in to update teams.")

当我尝试调用它时出现以下错误:

Cannot assign "'54'": "StraightredFixture.home_team" must be a "StraightredTeam" instance.

54 id 需要输入正确的teamid。 54肯定在straightred_fixturetable.

的teamdid中

我认为这与外键有关,因为任何不是外键的东西似乎都可以正常工作。我确定我在某个地方遇到了简单的语法问题。

非常感谢您提供的任何帮助,Alan。

您可能是从某个较旧的 Django 版本升级而来的? 如果是这样,请注意现在,在分配外键时,您必须分配一个已保存的外部对象实例。如果你只想通过 id 分配,那么使用 <fieldname>_id

我相信,在这里,

fixtureUpdate = StraightredFixture(
    fixtureid=fixture['Id'],
    away_team_id=fixture['AwayTeam_Id'],
    home_team_id=fixture['HomeTeam_Id']
)

...应该可以解决问题。