Reputation: 961
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
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