Я работаю над менеджером турниров и начинаю работать над системой матчей. У меня вопрос, как я могу вернуть все комбинации двух команд, и тогда я смогу создавать матчи с этими комбинациями?
Позвольте мне объяснить немного. Одна команда принадлежит только одному пулу. В модели «Команда»,
У меня есть поле внешнего ключа, которое ссылается на пул, к которому принадлежит команда. В моем алгоритме я хотел бы создавать матчи двух команд, принадлежащих к одному пулу. Например, у меня есть команда 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 %}