我正在开始我的第一个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(我的第一个问题)。
非常感谢任何信息或建议。
答案 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
字段,只需使用ForeignKey
,ManyToManyField
等关系。在我的头脑中,这是我唯一可以提出的建议。
从这个项目的范围来看,你不会对关系太多的数据库施加太多压力,所以现在不用担心。那&#39;它。如果您有任何更具体的问题,您可以询问。干杯! :)
P.S。我不确定您的项目详细信息,因此请使用您认为合适的关系,无论是一对一,多对一还是多对多等,请阅读文档以获取更多详细信息。 :)