Alan Tingey
Alan Tingey

Reputation: 961

Django update MySQL database issue involving foreign keys

Good morning all,

I have the following two models:

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'

The following view works perfectly:

@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.")

However, the following view does not work:

@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.")

When I try to call it I get the following error:

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

54 id the correct teamid that needs to be entered. 54 is definitely in the teamdid of the straightred_fixture table.

I assume it is something to do with the foreign key as anything that is not a foreign key seems to work perfectly. I am sure I have a simple syntax issue somewhere.

Many thanks for any help that may be give, Alan.

Upvotes: 0

Views: 50

Answers (1)

spectras
spectras

Reputation: 13542

You probably upgraded from some older Django version? If so, note that now, when assigning foreign keys, you must assign a saved instance of the foreign object. If you want to just assign by id, then use <fieldname>_id

I believe, here,

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

...should do the trick.

Upvotes: 1

Related Questions