Django建立关系模型



这里有两个模型:Group和Player。我的目标是有不同的小组,每个小组都有球员。每个玩家可以属于一个或多个组。在一个小组中,每个玩家都有一些积分,但同一名玩家在另一个小组中可以有不同的积分。

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使用一个自定义的多对多关系模型,在该字段中使用through参数,如下所示:


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()

最新更新