(初学者)第一个Django Web App - models.py

时间:2016-01-13 01:19:58

标签: python django dynamic webpage

我正在开始我的第一个Django网络应用程序[在完成Django官方教程和Django Girls教程之后] ..我在设置模型时遇到了一些麻烦。我现在有一些有用的东西,但我觉得效率很低,我宁愿在前进之前学会正确的方法..

开始 - 当学习一种新的编程语言时,许多人(在互联网上)建议选择一个你喜欢的主题/爱好并从中创建一个项目。我非常喜欢运动,想要重建虚拟记分牌,类似于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的游戏数量。比每个游戏都有:结果(null或' FINAL'),当前季度(' 1'或null),当前时钟(' 00'或null)客场球队(' CHA'),客场得分(' 99'),主队(' TOR')和主场得分(' 102') )。然后,我会将团队ID与团队成员进行比较。每个团队都有一个班级(用于css:' tor'),一个城市('多伦多')和全名('猛禽')。

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

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

非常感谢任何信息或建议。

2 个答案:

答案 0 :(得分:1)

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

<强>更新

这将是这样的:

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

您可以访问Team变量中关联的away_team类。无需拨打away_team_id

答案 1 :(得分: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等关系。在我的头脑中,这是我唯一可以提出的建议。

从这个项目的范围来看,你不会对关系太多的数据库施加太多压力,所以现在不用担心。那&#39;它。如果您有任何更具体的问题,您可以询问。干杯! :)

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