Отношение моделей 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()