如何返回Django中两个团队的所有组合?

2024-06-17 08:20:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我在为一个锦标赛经理工作,我开始为比赛系统工作。我的问题是如何返回两支球队的所有组合,然后我就能够用这些组合创建比赛?
让我解释一下。一个队只属于一个游泳池。在“团队”模式中, 我有一个外键字段,它引用团队所属的池。在我的算法中,我想创建属于同一个池的两支球队的比赛。例如,我有团队A,B,C,D,我想创建匹配A对B,匹配A对C,匹配A对D,依此类推

我在这里看了一下:https://docs.python.org/3/library/itertools.html,发现了“combinations”函数,但仅此而已。你知道吗

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)

但我有个错误:

name 'combinations' is not defined

如果有人有更好的主意,我想听听。你知道吗

我使用的是python3.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 %}

Tags: nameinnoneiddefaultforobjectsmodels