Отношение моделей Django

Идея заключается в том, что существует две модели: Группа и Игрок. Моя цель состоит в том, что существуют различные группы, и в каждой группе есть игроки. Каждый игрок может принадлежать к одной или нескольким группам. Внутри группы каждый игрок имеет некоторое количество накопленных очков, но тот же игрок может иметь другое количество очков, накопленных в другой группе.

class Player(models.Model):
    username = models.CharField(max_length = 200)
    won_games = models.IntegerField(default=0)

class Point(models.Model):
    player = models.ForeignKey(Player, on_delete=models.PROTECT, related_name='points')
    val = models.IntegerField()
    group =  models.ForeignKey(Group, on_delete=models.PROTECT, related_name='points')

class Group(models.Model):
    id = models.CharField(max_length = 200)
    players = models.ManyToManyField(Player,related_name="groups")
    points = models.ManyToManyField(Point)

Я запутался, потому что не знаю, как сделать так, чтобы игрок имел "x" очков в группе A (например), а также имел "y" очков в группе B. Я хочу иметь возможность показывать данные группы, для каждой группы показывать ее членов и их очки.

Вы можете сказать Django использовать пользовательскую модель для отношений "многие ко многим", используя сквозной параметр в этом поле, вот таким образом:


class Player(models.Model):
    username = models.CharField(max_length = 200)
    won_games = models.IntegerField(default=0)


class Group(models.Model):
    id = models.CharField(max_length = 200)
    players = models.ManyToManyField(Player, related_name="groups", through='Point')


class Point(models.Model):
    player = models.ForeignKey(Player, on_delete=models.PROTECT, related_name='points')
    group =  models.ForeignKey(Group, on_delete=models.PROTECT, related_name='points')

В документации Django есть пример на эту тему: https://docs.djangoproject.com/en/4.1/topics/db/models/#extra-fields-on-many-to-many-relationships

Вероятно, вам нужна промежуточная таблица с дополнительным полем. Что-то похожее на это:

from django.db import models

class Player(models.Model):
    username = models.CharField(max_length = 200)
    won_games = models.IntegerField(default=0)

    def __str__(self):
        return self.username

class Group(models.Model):
    name = models.CharField(max_length=128)
    players= models.ManyToManyField(Player, through='Point')

    def __str__(self):
        return self.name

class Point(models.Model):
    player = models.ForeignKey(Player, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    point = models.IntegerField()

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