Django和外键保存连接

时间:2013-01-28 05:50:45

标签: python django foreign-keys django-views

我正在创建一个关于棒球运动员的网站用于学习目的。我是如何处理外键的。 这是我的模特:

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

所以我能够获得玩家统计数据,但如何将其保存到数据库?

我想做的例子。我能够收集并保存我想要在我的网站上拥有的所有玩家并保存他们所有的BIOS。我唯一需要的是球员Career Stat。

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 :(得分: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>