【发布时间】:2013-01-28 05:50:44
【问题描述】:
我正在创建一个关于棒球运动员的网站以供学习。我很了解如何处理外键。 这是我的模型:
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。 提前致谢
【问题讨论】:
-
旁注:python中的变量不能以数字开头,所以你必须给
2h一个不同的名字。另外,我认为models.ForeignKey('PLayer_Bios')是一个错字。 -
你需要为此创建一个 forms.py
-
您不必强调 player_id,因为在数据库中它将是 player_id_id,只需输入 player only
-
据我所知,当您在统计模型中创建条目时,您的要求是在 player_id 字段中传递的内容。您只需要获取 Player_Bios 模型的实例并将该实例传递给 player_id 字段。像 p = Player_Bios.objects.get(id=4456),现在你有了 id 为 4456 的玩家的对象,你可以像这样创建 Stat 模型 st = Stat(player_id=p, year=year, h= h, 2h=2h)
标签: python django foreign-keys django-views