1

我正在创建一个关于棒球运动员的网站以供学习。我很了解如何处理外键。这是我的模型:

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。提前致谢

4

1 回答 1

0

您需要创建表单,以便您轻松选择播放器。如果您想像手动添加一样添加,那对您来说将很困难。

表格.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()

视图.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>
于 2013-01-28T06:04:28.677 回答