Django与外键保存连接
我正在创建一个关于棒球运动员的网站,目的是为了学习。我在处理外键的时候遇到了困难。
这是我的模型:
class Player_Bios(models.Model):
mlb_id = models.SlugField(unique=True)
name = models.CharField(max_length=50)
last = models.CharField(max_length=50)
middle = models.CharField(max_length=50, blank=True)
jersey = models.CharField(max_length=5)
def __unicode__(self):
return self.mlb_id
class Stat (models.Model):
player_id = models.ForeignKey('Player_Bios')
year = models.IntegerField(max_length=50)
h = models.IntegerField(max_length=50)
2h = models.IntegerField(max_length=50)
def __unicode__(self):
return self.stat_id
我可以获取到球员的统计数据,但我该如何将这些数据保存到数据库呢?
我想做的事情是这样的:我已经收集并保存了所有我想在网站上展示的球员信息,包括他们的个人简介。现在我唯一需要的就是球员的职业统计数据。
from player_bios.models import *
year = "2012" # I use variable in this example because I don't want to put all my code
h = 180 #But think that I have this info
2h = 30
st= Stat(player_id=, year=year,h=h,2h=2h) #I don't know what to use on player id because that's the foreign key
st. save
更新:
我在将数据保存到数据库时仍然遇到问题。这里是我的代码:
from django.core.management.base import BaseCommand, CommandError
from player_bios.models import *
import urllib2
import json
import string
import re
DR_ID = [u'430947', u'499864', u'405395']
stint = ["player_id","sport_code","ab","league_full","bb","ops","hr","season","ao","team_id",
"go","cs","league_short","avg","go_ao","sport_id","team_full","league","sport","gidp",
"d","g","team_abbrev","league_id","h","ibb","team_seq","sf","sac","team_short","r","so",
"t","rbi","sb","slg","tb","hbp","obp"]
st = {}
class Command(BaseCommand):
for i in DR_ID:
url = ("http://mlb.mlb.com/lookup/json/named.sport_hitting_composed.bam?game_type='R'&sport_code='mlb'&sport_code='aaa'&sport_code='aax'&sport_code='afa'&sport_code='afx'&sport_code='asx'&sport_code='rok'&sort_by='season_asc'&player_id="+i+"&sport_hitting_composed.season=2013")
res = urllib2.urlopen(url)
data = json.load(res)
numberofseasons = data['sport_hitting_composed']['sport_hitting_tm']['queryResults']['totalSize']
numberofseasons= int(numberofseasons)
row = 0
while row < numberofseasons:
for x in stint:
data2 = data['sport_hitting_composed']['sport_hitting_tm']['queryResults']['row'][row][x]
st[x]=data2
row +=1
p_id = p=Player_Bios.objects.get(mlb_id=i)
p_id_st=str(p_id)
bat_id = (st['season']+st["team_id"])
bat_id = p_id_st + bat_id
c = BatStat(player_id_id= p_id.mlb_id,bat_stat_id=bat_id, sport_code = st["sport_code"],ab=st['ab'],league_full=st['league_full'],bb=st['bb'],ops=st['ops'],hr=st['hr'],season=st['season'],ao=st['ao'],
team_id=st['team_id'],go=st['go'],cs=st['cs'],league_short=st['league_short'],avg=st['avg'],go_ao=st['go_ao'],sport_id=st['sport_id'],team_full=st['team_full'],
league=st['league'],sport=st['sport'],gidp=st['gidp'],d=st['d'],g=st['g'],team_abbrev=st['team_abbrev'],league_id=st['team_id'],h=st['h'],ibb=st['ibb'],
team_seq=st['team_seq'],sf=st['sf'],sac=st['sac'],team_short=st['team_short'],r=st['r'],so=st['so'],t=st['t'],rbi=st['rbi'],sb=st['sb'],slg=st['slg'],tb=st['tb'],
hbp=st['hbp'],obp=st['obp'])
c.save()
我遇到了以下错误:
django.db.utils.IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`player_bios_info`.`player_bios_batstat`, CONSTRAINT `player_id_id_refs_id_ee2da61` FOREIGN KEY (`player_id_id`) REFERENCES `player_bios_player_bios` (`id`))')
在我的模型中有 player_id,但在数据库中我看到的是 player_id_id。
提前谢谢你们的帮助。
1 个回答
0
你需要创建一个表单,这样你就可以轻松选择玩家。如果你想像之前那样手动添加,可能会很麻烦。
forms.py
class StatForm(forms.ModelForm):
class Meta:
model = Stat
def __init__(self, user, *args, **kwargs):
super(StatForm, self).__init__(*args, **kwargs)
self.fields['player_id'].queryset = Player_Bios.objects.filter()
views.py
def add_stat(request):
if request.method == 'POST':
form = StatForm(request.POST)
if form.is_valid():
form.save()
return render(request, 'add_stat.html', {
'form': StatForm(),
})
add_stat.html
<form method="post">{% csrf_token %}
{% for field in form %}
{{field}}<br/>
{% endfor %}
<input type="submit" value="Save Stat">
</form>