2016-01-13 59 views
1

我开始我的第一个Django网络应用程序[在完成Django官方教程和Django女孩教程之后] ..我在设置模型时遇到了一些麻烦。我现在有一些工作,但我觉得这是相当低效的,我宁愿在未来之前学会正确的方式。(初学者)第一个Django Web应用程序 - models.py

开始 - 当学习一种新的编程语言时,很多人(在互联网上)建议选择一个你喜欢的话题/爱好并制作一个项目。我很喜欢体育运动,想要重新创建一个类似于ESPN或任何其他体育网站的虚拟记分牌。

我的models.py目前看起来是这样的 -

class Game(models.Model): 
    # start_time = models.DateTimeField() 
    today = models.DateField(default=date.today) 
    game_id = models.AutoField(primary_key=True) 
    game_outcome = models.CharField(max_length=8) 
    game_quarter = models.CharField(max_length=1) 
    game_clock = models.PositiveSmallIntegerField() 
    away_team_id = models.CharField(max_length=3) 
    away_team_class = models.CharField(max_length=3) 
    away_team_city = models.CharField(max_length=13) 
    away_team_name = models.CharField(max_length=12) 
    away_team_score = models.PositiveSmallIntegerField() 
    home_team_id = models.CharField(max_length=3) 
    home_team_class = models.CharField(max_length=3) 
    home_team_city = models.CharField(max_length=13) 
    home_team_name = models.CharField(max_length=12) 
    home_team_score = models.PositiveSmallIntegerField() 

,但我觉得这是太多的变量,而不是去了解它的正确方法。我也尝试过这样的事情...

class Day(models.Model): 
    today = models.DateField(default=date.today) 

class Game(models.Model): 
    game_id = models.AutoField(primary_key=True) 
    game_outcome = models.CharField(max_length=8) 
    game_quarter = models.CharField(max_length=1) 
    game_clock = models.PositiveSmallIntegerField() 
    away_team_id = models.CharField(max_length=3) 
    away_team_score = models.PositiveSmallIntegerField() 
    home_team_id = models.CharField(max_length=3) 
    home_team_score = models.PositiveSmallIntegerField() 

class Team(models.Model): 
    team_id = models.ForeignKey('Team') 
    team_class = models.CharField(max_length=3) 
    team_city = models.CharField(max_length=13) 
    team_name = models.CharField(max_length=12) 

每天都有0到游戏XX量。每场比赛都有:结果(空或'FINAL'),当前季度('1'或null),当前时钟('00:00'或null),客队('CHA'),客场比分('99' ),主队('TOR')和主场比分('102')。然后,我将采取团队ID并将其与班级团队进行比较。每个团队都有一个班级(用于css:'tor'),一个城市('Toronto')和全名('Raptors')。

它仍然没有粘在我的头上。我可以获取python shell中的所有信息并输出到我的html/css中,但我感觉效率很低。此外,每一天都有自己的html页面(类似于website.com/nba/scores/20150112/),并且充满了当天的所有游戏。

对不起,如果这太初学者问,我花了很多时间寻找答案,最后决定发布stackoverlow(我的第一个问题)。

任何信息或建议将不胜感激。

回答

1

我认为你的模型方法的总体思路是足够好的。不过,我鼓励你通过Django's ORM relationships documentation。如果你想使用字符串作为你的主键,这是可以的,但是让Django的ORM知道使用the proper model field。如果您使用主键和外键(关系),您的dbms将在必要字段上创建索引,从而实现更高效的查询。让我知道如果这有帮助!祝你的项目好运!

UPDATE:

这将是这样的:

class Day(models.Model): 
    today = models.DateField(default=date.today) 

class Game(models.Model): 
    game_outcome = models.CharField(max_length=8) 
    game_quarter = models.CharField(max_length=1) 
    game_clock  = models.PositiveSmallIntegerField() 
    day = models.ForeignKey(Day, on_delete=models.CASCADE) 
    away_team  = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='away_team') 
    away_team_score = models.PositiveSmallIntegerField() 
    home_team  = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='home_team') 
    home_team_score = models.PositiveSmallIntegerField() 

class Team(models.Model): 
    team_class = models.CharField(max_length=3) 
    team_city = models.CharField(max_length=13) 
    team_name = models.CharField(max_length=12) 

请注意,我省略了所有id领域,因为Django会使用一个自动创建的,其行为一样AutoField。另请注意,由于Game有两个对同一类(Team)的引用,因此需要提供额外的参数related_name。关于它的信息在django docs about related_name

这样一来,你可以做这样的事情

game = Game.objects.find(1) 
away_team_name = game.away_team.team_name 

您可以访问away_team变量相关Team类。根本不需要拨打away_team_id

+0

太棒了,谢谢! 所以,如果我阅读文档后正确地理解,这将是设置了...? 类日 类游戏......有一天一个多到一的关系(10场比赛,只有1天) 一流团队......有游戏一比一的关系(每个home_team_id和away_team_id是直接与他们TEAM_NAME,team_city,和一流的团队本身) – zacarellano

+0

@asapzacy team_class一个一对一的关系:好概念,在'Game'类,外键'Team'也多到一个realtionships,因为一个“团队”可以参与许多“游戏”。检查更新 – Throoze

1

首先你需要了解你使用你把数据库上的更多的负载越ForeignKeys的。但是它也取决于views.py代码。其次,如果您使用ForeignKey,则不需要使用team_id作为字段名称。只要提到班级名称,它会自动为该字段创建一个_id

请看下面的代码:

class Game(models.Model): 
    start_time = models.DateTimeField() 
    today = models.DateField(default=date.today) 
    game_id = models.AutoField(primary_key=True) # You don't need this line, an id field is created for EVERY model class even if you don't specify it. 
    game_outcome = models.CharField(max_length=8) 
    game_quarter = models.CharField(max_length=1) 
    game_clock = models.PositiveSmallIntegerField() 
    away_team = models.ForeignKey('Team') 
    home_team = models.ForeignKey('Team') 

class Team(models.Model): 
    team_class = models.CharField(max_length=3) 
    city = models.CharField(max_length=13) 
    name = models.CharField(max_length=12) 
    score = models.PositiveSmallIntegerField() 

你可以看到,我已经通过的Team名称创建另一个类,并把四个字段上这是在原来的Game类重复。然后,我已将Team课程连接到Game课程,并将其与ForeignKey连接起来。如果安装SQLiteBrowser,并检查了数据库文件,然后你会看到away_team场实际上是在数据库中的away_team_id字段,因为Django的需要的照顾。你并不需要创建id领域,只是使用关系像ForeignKeyManyToManyField等关闭我的头顶,这是我可以建议的唯一的事情。

通过这个项目,你会不会把太多的压力太多关系数据库的范围来看,所以现在不担心。就是这样。如果您有任何更具体的问题,你可以问。干杯! :)

P.S.我不确定您的项目详情,请使用您认为合适的关系,无论是一对一,多对一还是多对多等。请阅读文档以获取更多详细信息。 :)