On Jan 3, 2:36 pm, Tijmen <tijmen.vandenbr...@gmail.com> wrote: > Hi there, > > First of all let me say I'm just starting here but need some help with > a rather basic question. > > I want to make an app that holds baseball statistics for players of > each game and over several seasons. Now I'm new to this db > relationship thing and would like to hear your opinion. > > My models.py currently looks like this: > > <code> > from django.db import models > > # Create your models here. > class Player(models.Model): > GENDER_CHOICES = ( > ('M', 'Male'), > ('F', 'Female'), > ) > > BATS_CHOICES = ( > ('R', 'Right'), > ('L', 'Left'), > ('B', 'Both'), > ) > > THROWS_CHOICES = ( > ('R', 'Right'), > ('L', 'Left'), > ('B', 'Both'), > ) > > first_name = models.CharField(max_length=50) > last_name = models.CharField(max_length=50) > gender = models.CharField(max_length=1, choices=GENDER_CHOICES) > bats = models.CharField(max_length=1, choices=BATS_CHOICES) > throws = models.CharField(max_length=1, choices=THROWS_CHOICES) > birthdate = models.DateTimeField('birth date') > awards = models.CharField(max_length=200) > height = models.IntegerField() > weight = models.IntegerField() > email = models.CharField(max_length=100) > tel = models.CharField(max_length=50) > > def __unicode__(self): > #return self.first_name, self.last_name, self.gender > return self.first_name + " " + self.last_name > > class Game(models.Model): > #players = models.ManyToManyField(Player) #Player > team = models.CharField(max_length=200) #Team for > which the player plays > league = models.CharField(max_length=200) #League > opponent = models.CharField(max_length=200) #The opponent > date = models.DateTimeField('date') #Date > > def __unicode__(self): > return self.team + " vs " + self.opponent > > class Season(models.Model): > year = models.DateTimeField('year') > > def __unicode__(self): > return self.year > > class Statistic(models.Model): > players = models.ManyToManyField(Player) > games = models.ManyToManyField(Game) > g = models.IntegerField() #Games played > or pitched > pa = models.IntegerField() #Plate > appearances estimated using AB + BB + HBP + SF + SH missing catcher > interferences > ab = models.IntegerField() #At bats > r = models.IntegerField() #Runs scored/ > allowed > h = models.IntegerField() #Hits/hits > allowed > doubles = models.IntegerField() #Doubles hit/ > allowed > triples = models.IntegerField() #Triples hit/ > allowed > hr = models.IntegerField() #Home Runs hit/ > allowed > rbi = models.IntegerField() #Runs Batted > In > sb = models.IntegerField() #Stolen Bases > cs = models.IntegerField() #Caught > Stealing > bb = models.IntegerField() #Bases on > Balls/Walks > so = models.IntegerField() #Strikeouts > ba = models.IntegerField() #Hits/At bats > obp = models.IntegerField() #On Base > Percentage (H + BB + HBP)/(AB + BB + HBP + SF) > slg = models.IntegerField() #Slugging, > Total Bases/At Bats (1B + 2 * 2B + 3 * 3B + 4 * HR)/AB > ops = models.IntegerField() #On base + > Slugging Percentages > opsplus = models.IntegerField() #100*[OBP/lg > OBP + SLG/lg SLG -1] > tb = models.IntegerField() #Total Bases > gdp = models.IntegerField() #Double Plays > Grounded Into > hbp = models.IntegerField() #Times Hit by > a Pitch > sh = models.IntegerField() #Sacrifice > Hits/Bunts > sf = models.IntegerField() #Sacrifice > Flies > ibb = models.IntegerField() #Intentional > Bases on Balls > pos = models.CharField(max_length=15) #Positions > > def __unicode__(self): > return "Stats" > </code> > > As you can see I have 4 classes defined: > - player > - game > - statistic > - season > > A game is played with several players, each player has statistics for > this game and a game is part of a season. Now I'm a bit lost in what > kind of relationship I should use. models.ManyToManyField or > models.ForeignKey... And where I should put the statement. > > Any help would be greatly appreciated. > > Thanks > > - Tijmen
Hi, First of all, I just wanted to confirm that a statistic represents a player's performance for a single game (it sounded like that from your question at the end but was unclear thanks to the "g" field on the Statistic model), I'll assume that it does. In this case you should have the following relationships: Since a game occurs in a single season, you want to have a ForeignKey in the Game model that represents the season that game occurred in. If Statistic does represent a stat for a specific player in a specific game then it should contain two foreign keys, one to Player and one to Game. Finally you can add a ManyToMany field to either Player or Game (it doesn't matter which one it goes on, but should only be on one) and you can specify that Statistic is the "through" table [1]. You could do that like this: players = models.ManyToManyField(Player, through='Statistic', related_name='games') # This would go in Game games = models.ManyToManyField(Game, through='Statistic', related_name='players') # This would go in Player The related_name argument will be the name given to the relationship on the other model, so with either of these you would have access to games on the Player model and players on the Game model. Hope this helps. [1] http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany -- G -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.