【问题标题】:Django and Foreign Key Saving ConnectionDjango 和外键保存连接
【发布时间】: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


【解决方案1】:

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

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>

【讨论】:

  • 我有一个脚本会废弃信息,所以不是手动的。谢谢
  • Ok :) 我的意思是,如果你通过这个 Stat(player_id=pla_id, year=year,h=h,2h=2h) 保存数据,我认为这对我来说是手动的.
猜你喜欢
  • 2011-04-26
  • 2011-11-14
  • 2017-05-10
  • 1970-01-01
  • 2012-11-29
  • 2018-10-01
  • 2013-08-23
  • 2013-10-11
  • 1970-01-01
相关资源
最近更新 更多