Отношения в базе данных между матчем и его игроками

Я пытаюсь разработать базу данных, которая бы сохраняла матчи и игроков в игре 3v3.

Пока что мои модели выглядят следующим образом :

class Player(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    player_tag = models.CharField(max_length=9, unique=True)
    player_name = models.CharField(max_length=50)
    trophy_count = models.IntegerField(default=0)
    club = models.ForeignKey('Club', on_delete=models.SET_NULL, null=True)
    total_club_war_trophy_count = models.IntegerField(default=0)


class Club(models.Model):
    club_name = models.CharField(max_length=50)
    club_tag = models.CharField(max_length=9, unique=True)


class Match(models.Model):
    # Matches are 3v3
    player_1 = models.ForeignKey(Player, on_delete=models.CASCADE)
    player_2 = models.ForeignKey(Player, on_delete=models.CASCADE)
    player_3 = models.ForeignKey(Player, on_delete=models.CASCADE)
    player_4 = models.ForeignKey(Player, on_delete=models.CASCADE)
    player_5 = models.ForeignKey(Player, on_delete=models.CASCADE)
    player_6 = models.ForeignKey(Player, on_delete=models.CASCADE)
    # Brawlball, Gem grab, Knockout ...
    mode = models.CharField(max_length=20)
    # Power match or normal match
    battle_type = models.CharField(max_length=20)
    trophies_won = models.IntegerField(default=0)
    date = models.DateTimeField(auto_now_add=True)

Однако повторение "player_<int>" вызывает у меня зуд, я не думаю, что это правильный способ сделать это. Что если количество игроков изменится в какой-то момент, или как мне узнать, участвовал ли игрок в матче? Я думаю, что это в лучшем случае неуклюжий подход.

Как мне лучше подойти к этому вопросу? Я думал о том, чтобы составить список игроков, но я не знаю, как охарактеризовать такого рода отношения.

Я думаю, что то, что я искал, было отношением ManyToMany. Doc : https://docs.djangoproject.com/fr/4.0/topics/db/examples/many_to_many/

Вы можете использовать ManyToManyField от Django, как показано ниже.

class Match(models.Model):
    # Matches are 3v3
    players = models.ManyToManyField(Player, blank = True)
    # Brawlball, Gem grab, Knockout ...
    mode = models.CharField(max_length=20)
    # Power match or normal match
    battle_type = models.CharField(max_length=20)
    trophies_won = models.IntegerField(default=0)
    date = models.DateTimeField(auto_now_add=True)

Тогда вы можете установить игроков на матч.

match = Match.objects.get(pk = 1)
# players with ids (1,2,3) are in the match with id of 1.
match.players.set([1,2,3])

Надеюсь, это может помочь.

Вернуться на верх