Создание табло со сложными правилами - PullRequest
0 голосов
/ 06 декабря 2010

Мне нужно составить табло, составив такой список правил:

Места команд на первом этапе Чемпионата определяются по наибольшему количеству очков.За победу в матче команда взимает 3 очка, за ничью - 1 очко и за поражение - 0 очков.

В случае равных результатов двух или более команд их места определяются следующим образом:

  1. По результатам игр друг с другом:

    • большее количество очков;

    • Наилучшая разница между забитыми и пропущенными голами;

    • Большее количество голов, забитых в этих играх;

    • Большее количество забитых головна чужом поле в этих играх;

  2. Большее количество побед во всех играх;

  3. Лучшая разницамежду забитыми и пропущенными голами во всех матчах;

  4. Наибольшее количество голов, забитых во всех матчах;

  5. Наибольшее количество забитых головв чужих полях во всех матчах;

Теперь у меня есть такие модели:

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 ]

1 голос
/ 06 декабря 2010

похоже, что вы хотите сделать, это использовать sort (). Сортировка Python сортирует кортежи лексикографически, т. е. если первый элемент одинаков, он проверяет второй (и т. д.)

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

эта функция будет возвращать список командных объектов, отсортированных в нужном вам порядке (в соответствии с первым пунктом маркера.

0 голосов
/ 06 декабря 2010

Я думаю, вы пытаетесь сделать три вещи одновременно; нет.

  1. Вставить информацию о каждой команде в таблицу (модель)
  2. Рассчитать оценку каждой команды на основе этой информации (модель)
  3. Отображение команд в порядке, основанном на счете (просмотр)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...