创建复杂规则的记分板
我需要根据以下规则来制作一个记分板:
在锦标赛的第一阶段,球队的排名是根据得分来决定的。赢得一场比赛,球队可以获得3分;如果是平局,得1分;输了则得0分。
如果有两支或更多球队的得分相同,那么它们的排名将按照以下方式来决定:
根据这些球队之间的比赛结果:
得分更高的球队优先;
进球数和失球数的差值更好的球队优先;
在这些比赛中进球数更多的球队优先;
在对方主场进球数更多的球队优先;
所有比赛中胜利场次更多的球队优先;
所有比赛中进球数和失球数的差值更好的球队优先;
所有比赛中进球数最多的球队优先;
所有比赛中在对方主场进球数最多的球队优先;
现在我有这样的模型:
from django.db import models
class Team(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return self.name
class Game(models.Model):
beginning = models.DateTimeField()
place = models.CharField(max_length=50)
spectators = models.IntegerField()
def __unicode__(self):
return self.beginning.strftime("%A, %d. %B %Y %I:%M%p")
class TeamGame(models.Model):
RESULT_WIN = 'w'
RESULT_DRAW = 'd'
RESULT_LOSE = 'l'
RESULT_CHOICES = (
(RESULT_WIN, 'Win'),
(RESULT_LOSE, 'Lose'),
(RESULT_DRAW, 'Draw'),
)
HOME_FIELD = 'h'
OUT_FIELD = 'o'
FIELD_CHOICES = (
(HOME_FIELD, 'home'),
(OUT_FIELD, 'out')
)
game = models.ForeignKey(Game)
team_name = models.ForeignKey(Team)
goals_hit = models.IntegerField()
goals_get = models.IntegerField()
result = models.CharField(max_length=1, choices=RESULT_CHOICES, blank=True)
field = models.CharField(max_length=1, choices=FIELD_CHOICES, blank=True)
我该如何制作这样一个复杂的东西呢?请帮帮我!
2 个回答
0
我觉得你现在想要一次性做三件事情,但其实不应该这样。
- 把每个团队的信息放进表格里(模型)
- 根据这些信息计算每个团队的分数(模型)
- 根据分数把团队按顺序显示出来(视图)
1
看起来你想做的是使用sort()这个函数。在Python中,sort()会按照字典顺序来排序元组,也就是说,如果第一个元素相同,它会继续检查第二个元素(依此类推)。
def rank_teams():
rank = []
# iterate through teams and create a tuple with most important to least important
# sort params. team bust be the last object
for team in Team.objects.all():
points = 0
best_goal_gap = 0
best_goals = 0
best_away_goals = 0
all_victories = 0
for game in TeamGame.objects.filter(team_name=team):
points += {'w':3, 'd':1, 'l':0}[game.result]
best_goal_gap = max(best_goal_gap, game.goals_hit-game.goals_get)
best_goals = max(best_goals, game.goals_get)
if game.field == 'o':
best_away_goals = max(best_away_goals, game.goals_get)
if game.result == 'w':
all_victories +=1
rank.append((points, best_goal_gap, best_goals, best_away_goals, all_victories, team))
#sort the teams
rank.sort()
team_rank = [team for p,g,b,a,v,team in rank]
return team_rank
这个函数会返回一个按照你想要的顺序排列的团队对象列表(根据第一个要点)。