Python ValueError:无法将field Schedule.swiming.player更改为Schedule.swiming.player(您无法更改M2M字段或从M2M字段更改)

Python ValueError:无法将field Schedule.swiming.player更改为Schedule.swiming.player(您无法更改M2M字段或从M2M字段更改),python,django,django-models,Python,Django,Django Models,这是我最初的游泳模型,它是从基础类比赛扩展而来的。现在我想向游泳模型添加一个中间模型PlayerSwimming。现在它在makemigration阶段被卡住了。我已经尝试了所有的可能性,比如先删除迁移,然后再次添加,注释和迁移,然后取消注释并再次迁移。帮助我!新型号为: class Match(models.Model): date = models.DateField('my date') time = models.TimeField() duration = m

这是我最初的游泳模型,它是从基础类比赛扩展而来的。现在我想向游泳模型添加一个中间模型PlayerSwimming。现在它在makemigration阶段被卡住了。我已经尝试了所有的可能性,比如先删除迁移,然后再次添加,注释和迁移,然后取消注释并再次迁移。帮助我!新型号为:

class Match(models.Model):

    date = models.DateField('my date')
    time = models.TimeField()
    duration = models.DurationField(null = True)
    category = models.CharField(max_length=20, choices=CATEGORY_CHOICES, default=CATEGORY_CHOICES[0][0])
    place = models.CharField(max_length=256, null=True)
    game_status = models.CharField(max_length=256, null=True) #completed or not

    # Foreign Keys
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    # teams = models.ManyToManyField(Team)

    class Meta:
        abstract = True   

 class Swimming(Match):
        time = models.TimeField(null=True)
        player = models.ManyToManyField(Player, related_name='player_swimming')
        game_level = models.CharField(max_length=256, null=True, choices=LEVEL_CHOICES) # like semi-final, final etc
        game_specific = models.CharField(max_length=256,null=True, choices=EVENT_CHOICES) #like Men's Shot Put or Men's Triple Jump etc

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

我想你的钥匙太多了。这会给你你想要的

class Swimming(Match):


    player = models.ManyToManyField(Player, through='PlayerSwimming')
    game_level = models.CharField(max_length=256, null=True, choices=LEVEL_CHOICES) # like semi-final, final etc
    game_specific = models.CharField(max_length=256,null=True, choices=EVENT_CHOICES) #like Men's Shot Put or Men's Triple Jump etc


    def __str__(self):
        return str(str(self.category) + "  " + str(self.date))


class PlayerSwimming(models.Model):

    player = models.ForeignKey(Player, on_delete=models.CASCADE)
    swimming = models.ForeignKey(Swimming, on_delete=models.CASCADE, default='')
    time = models.IntegerField(default=-1)
    medal = models.CharField(max_length=256,blank=True, choices=MEDAL_CHOICES)

    def __str__(self):
        return str(self.player)
        # return str(self.swimming) + str(" ") + str(self.player)

    class Meta:
        ordering = ['time']

PlayerSwimming
模型上,您不需要
播放器
游泳
,因为
游泳
模型具有这些功能,并且与
PlayerSwimming
相连。你确定你真的需要
PlayerSwimming
?嘿@RobL!我需要中间模型,因为我必须存储个人球员信息,如时间和奖牌,而我不能单独在“游泳”模型中这样做,因为它在“游泳”的球员领域有很多领域。那么为什么在
游泳
上有
球员
class Swimming(Match):
    game_level = models.CharField(max_length=256, null=True, choices=LEVEL_CHOICES)
    game_specific = models.CharField(max_length=256, null=True, choices=EVENT_CHOICES)

    def __str__(self):
        return str(str(self.category) + "  " + str(self.date))


class PlayerSwimming(models.Model):

    player = models.ForeignKey(Player, on_delete=models.CASCADE)
    swimming = models.ForeignKey(Swimming, on_delete=models.CASCADE, default='')
    time = models.IntegerField(default=-1)
    medal = models.CharField(max_length=256,blank=True, choices=MEDAL_CHOICES)

    def __str__(self):
        return str(self.player)
        # return str(self.swimming) + str(" ") + str(self.player)

    class Meta:
        ordering = ['time']