Django 模型:一个玩家可以玩很多游戏,而一个游戏只能由两个玩家玩?

问题描述 投票:0回答:1

我的 django 模型有问题..

我有2个模型(表)玩家和游戏作为多对多关系,第三个模型作为它们之间的中间表,其中玩家用户名作为外键(用户名是玩家的表pk)和game_id fk ,还有一个附加属性分数,问题是超过2个玩家可以玩同一个游戏,这不是我想要的,我想要的是每个游戏都可以精确地并且只能由两个玩家玩。

如何使用 django 实现这一点?

这是型号:


class Player(models.Model):
    username = models.CharField(max_length=20, primary_key=True)
    fname = models.CharField(max_length=20, blank=False)
    lname = models.CharField(max_length=20, blank=False)
    avatar = models.ImageField(upload_to='./app/avatars/', blank=True, null=True)
    is_online = models.BooleanField(default=False)
    game_theme = models.ImageField(upload_to='./app/themes/', blank=True, null=True)
    played_games_num = models.IntegerField(default=0)

    def __str__(self):
        return self.username


class Game(models.Model):

    mode_choices = {
        'classic': 'Classic',
        'vs_robot': 'Vs Robot'
    }
    difficulty_choices = {
        -1: 'Vs Player',
        1: 'Easy',
        2: 'Medium',
        3: 'Hard'
    }

    game_id = models.AutoField(primary_key=True)
    mode = models.CharField(max_length=10, choices=mode_choices)
    difficulty = models.IntegerField(choices=difficulty_choices)
    game_date_time = models.DateTimeField(auto_now_add=True)
    duration = models.IntegerField()
    players = models.ManyToManyField(Player, through='Player_game')

    def __str__(self):
        return str(self.game_id)

class Player_game(models.Model):
    username = models.ForeignKey(Player, on_delete=models.CASCADE)
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    score = models.IntegerField()

    class Meta:
        unique_together = ['username', 'game']

    def __str__(self):
            return str(self.game_id)

询问我任何其他信息。

我尝试在 Meta 类中添加 unique_together,但这并没有解决问题

django database django-models foreign-keys manytomanyfield
1个回答
0
投票

修改Player_game模型,对游戏字段有唯一的约束,确保每个游戏只能有两个玩家与之关联。 实现自定义验证方法或重写保存方法以通过编程方式强制执行约束。

在此输入图片描述

© www.soinside.com 2019 - 2024. All rights reserved.