У меня есть веб-сайт прогнозирования Кубка мира, который написан с использованием фреймворка Django
. Каждый раз, когда пользователь запрашивает просмотр постоянной таблицы определенного конкурса, представление stand_stable ищет всех пользователей, связанных с этим конкурсом, затем загружает все связанные игры, а также прогнозы пользователей, а затем в цикле for сравнивает прогнозируемый результат с фактическим результатом и присваивает баллы на основе системы правил. По моему опыту, когда у меня более 10 пользователей, зарегистрировавшихся в конкурсе, в котором участвуют не менее 30 или более игр, представление stand_table становится очень медленным и загрузка таблицы занимает более 5-10 секунд.
Я понимаю, что способ, которым я делаю это, неэффективен, и я бы предпочел сделать математику раз и навсегда после того, как каждая игра закончилась, и пользователи могут быть направлены к этим предварительно созданным постоянным столам. Однако я не знаю, как хранить такую таблицу как модель Django
.
Вот мой show_standing
просмотр
@login_required
def show_standing(request, contest):
contest = request.user.contests.filter(name=contest).all()[0]
users = contest.users.all()
rows = []
for user in users:
exact_groupstage = utils.get_correct_predictions(user, contest, 'exact', 'groupstage')
goal_difference_groupstage = utils.get_correct_predictions(user, contest, 'goal-difference', 'groupstage')
winner_only_groupstage = utils.get_correct_predictions(user, contest, 'winner-only', 'groupstage')
exact_playoffs = utils.get_correct_predictions(user, contest, 'exact', 'playoffs')
goal_difference_playoffs = utils.get_correct_predictions(user, contest, 'goal-difference', 'playoffs')
winner_only_playoffs = utils.get_correct_predictions(user, contest, 'winner-only', 'playoffs')
row = []
row.append(user)
row.append(exact_groupstage + exact_playoffs)
row.append(goal_difference_groupstage + goal_difference_playoffs)
row.append(winner_only_groupstage + winner_only_playoffs)
row.append(exact_groupstage*3 + goal_difference_groupstage*2 + winner_only_groupstage*1 +
exact_playoffs*6 + goal_difference_playoffs*4 + winner_only_playoffs*2)
rows.append(row)
rows = sorted(rows, key=lambda x:x[4], reverse=True)
data = {'rows': rows,
'contest': contest.name}
return render(request, 'standing.html', data)
Вот как выглядит get_correct_predictions
:
def get_correct_predictions(user, contest, kind, round):
bets = user.bets.filter(contest=contest)
# games = Game.objects.all()
num_exact_predictions = 0
num_goal_dif_predictions = 0
num_winner_only_predictions = 0
for bet in bets:
game = bet.game
if not is_played(game):
continue
if round == 'groupstage':
if game.isplayoff:
continue
elif round == 'playoffs':
if not game.isplayoff:
continue
else:
raise Exception('Round can only be "groupstage" or "playoffs"')
home_predicted = bet.home_score
away_predicted = bet.away_score
home_actual = game.home_score
away_actual = game.away_score
# exact result predicted
if (home_predicted == home_actual) and (away_predicted == away_actual):
num_exact_predictions += 1
# only goal difference predicted
elif (home_predicted - away_predicted) == (home_actual - away_actual):
num_goal_dif_predictions += 1
# only winner predicted
elif (home_predicted - away_predicted) * (home_actual - away_actual) > 0:
num_winner_only_predictions += 1
if kind == 'exact':
return num_exact_predictions
elif kind == 'goal-difference':
return num_goal_dif_predictions
elif (kind == 'winner-only'):
return num_winner_only_predictions
Редактировать 1: Вот мои модели:
class Contest(models.Model):
tournament = models.ForeignKey(Tournament)
name = models.CharField(max_length=20)
users = models.ManyToManyField(User, related_name='contests')
class Team(models.Model):
name = models.CharField(max_length=20)
abbreviation = models.CharField(max_length=3)
class Game(models.Model):
tournament = models.ForeignKey(Tournament, related_name='games')
home = models.ForeignKey(Team, related_name='%(class)s_home')
away = models.ForeignKey(Team, related_name='%(class)s_away')
home_score = models.IntegerField()
away_score = models.IntegerField()
isplayoff = models.BooleanField(default=False)
scheduled_datetime = models.DateTimeField()
class Bet(models.Model):
user = models.ForeignKey(User, related_name='bets')
game = models.ForeignKey(Game, related_name='bets')
contest = models.ForeignKey(Contest, related_name='bets')
home_score = models.IntegerField()
away_score = models.IntegerField()
Очень ценю вашу помощь.