Как вернуть все комбинации двух команд в Джанго? - PullRequest
2 голосов
/ 14 мая 2019

Я работаю над менеджером турниров и начинаю работать над системой матчей. У меня вопрос, как я могу вернуть все комбинации двух команд, и тогда я смогу создавать матчи с этими комбинациями?
Позвольте мне объяснить немного. Одна команда принадлежит только одному пулу. В модели «Команда», У меня есть поле внешнего ключа, которое ссылается на пул, к которому принадлежит команда. В моем алгоритме я хотел бы создавать матчи двух команд, принадлежащих к одному пулу. Например, у меня есть команда A, B, C, D, я хочу создать матч A против B, матч A против C, матч A против D и т. Д.

Я посмотрел немного здесь: https://docs.python.org/3/library/itertools.html, и нашел функцию "комбинации", но не более того.

models.py

class Match(models.Model):
    scoreTeam1  = models.IntegerField()
    scoreTeam2  = models.IntegerField()
    phase       = models.ForeignKey(Phase, default=None, on_delete=models.CASCADE)
    teams       = models.ManyToManyField(Team, default=None, blank=True)

class Pool(models.Model):
    name    = models.CharField(max_length=16)
    nbTeam  = models.IntegerField(validators=[
                                    MaxValueValidator(4),
                                    MinValueValidator(3)
                                ])
    phase   = models.ForeignKey(Phase, default=None, on_delete=models.CASCADE)
    field   = models.ForeignKey(Field, default=None, on_delete=models.CASCADE)

class Team(models.Model):
    name        = models.CharField(max_length=16)
    totalpoints = models.IntegerField(default=0)
    position    = models.IntegerField(default=0)
    category    = models.ForeignKey(Category, default=None, on_delete=models.CASCADE)
    pool        = models.ForeignKey(Pool, default=None, blank=True, null=True, on_delete=models.SET_NULL)

views.py

def matches_phase_view(request, id, id_phase, *args, **kwargs):
    tournaments = Tournament.objects.filter(user=request.user)
    tournament = Tournament.objects.get(pk=id)
    phase = Phase.objects.get(pk=id_phase)
    pools = Pool.objects.filter(phase=phase)
    teams = Team.objects.filter(pool__in=pools)

    matches_count = 0
    for pool in pools:
        matches_count = matches_count + pool.nbTeam * (pool.nbTeam - 1) // 2
    for pool in pools:
        teams_combinations = combinations(Team.objects.filter(pool=pool), 2)
        list_teams_combinations = list(teams_combinations)
        for combination in list_teams_combinations:
            match = Match.objects.create(phase=phase)
            match.teams.add(combination[0])
            match.teams.add(combination[1])
            match.save()

    matches = Match.objects.filter(phase=phase)
    context = {
        'tournaments': tournaments,
        'tournament': tournament,
        'pools': pools,
        'teams': teams,
        'matches_count': matches_count,
        'matches': matches,
    }
    return render(request, 'tournament_manage_phase_matches.html', context)

Я пробовал это:

for pool in pools:
        a = combinations(Team.objects.filter(pool=pool), 2)

Но у меня есть эта ошибка:

название 'комбинации' не определено

Если у кого-то есть идея получше, я бы хотел ее услышать.

Я использую Python 3.7, Django 2.2.

Редактировать:

template

{% extends 'base_tournament.html' %}

{% load crispy_forms_tags %}

{% block title %}
  Tournament
{% endblock %}

{% block navbar_manage %}
    {% include 'navbar_manage.html' %}
{% endblock %}

{% block content %}
    <h1>Matches of ...</h1>

    <ul class="nav nav-tabs" id="myTab" role="tablist">
    {% for pool in pools %}
        <li class="nav-item">
            <a class="nav-link" id="{{ pool.name }}-tab" data-toggle="tab" href="#{{ pool.name }}" role="tab" aria-controls="{{ pool.name }}" aria-selected="true">{{ pool.name }}</a>
        </li>
    {% endfor %}
    </ul>
    <div class="tab-content" id="myTabContent">
        {% for pool in pools %}
            <div class="tab-pane fade" id="{{ pool.name }}" role="tabpanel" aria-labelledby="{{ pool.name }}-tab">
                {% for match in matches %}
                    <p>Wait for a moment</p>
                {% endfor %}
            </div>
        {% endfor %}
    </div>

{% endblock %}

1 Ответ

1 голос
/ 14 мая 2019

from itertools import combinations

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...