Python 在多个关系中保存()

Python 在多个关系中保存(),python,django,python-2.7,Python,Django,Python 2.7,我有两个有很多关系的模型。代码如下: class Player(models.Model): first_name = models.CharField(max_length = 30, verbose_name = u"First name") last_name = models.CharField(max_length = 50, verbose_name = u"Last name") def __unicode__(self): return

我有两个有很多关系的模型。代码如下:

class Player(models.Model):

    first_name = models.CharField(max_length = 30, verbose_name = u"First name")
    last_name = models.CharField(max_length = 50, verbose_name = u"Last name")

    def __unicode__(self):
        return "%s %s" % (self.last_name, self.first_name)

class Tournament(models.Model):
    title = models.CharField(max_length = 100, verbose_name = u"Tournament's title")
    players = models.ManyToManyField(Player,verbose_name = u"Tournament's players")

    def __unicode__(self):
        return self.title

    def save(self, **kwargs):
        Tournament(title = self.title)
        all_players = Player.objects.all()
        for member in all_players:
            member_of_tournament = member.tournament_set.filter(title = self.title)
            for j in member_of_tournament:
                print member.tournament_set.filter(title = self.title)
                self.players.add(member)

        super(Tournament, self).save(**kwargs)

当我第一次保存锦标赛时,它只保存标题。但当我下次救球时,它也救出了球员,并将他们与比赛联系起来。我怎样才能在比赛的同时保存它们?

我想你这里有一些问题:

class Tournament(models.Model):
    title = models.CharField(max_length = 100, verbose_name = u"Tournament's title")
    players = models.ManyToManyField(Player,verbose_name = u"Tournament's players")

    def __unicode__(self):
        return self.title

    def save(self, **kwargs):
        Tournament(title = self.title)
        all_players = Player.objects.all()
        for member in all_players:
            member_of_tournament = member.tournament_set.filter(title = self.title)
            for j in member_of_tournament:
                print member.tournament_set.filter(title = self.title)
                self.players.add(member)

        super(Tournament, self).save(**kwargs)
一般来说,您不希望在模型保存方法中使用m2m关系(在本例中,在任何情况下,其逻辑都不是很好)

save方法本身存在一些问题,因此让我来解决这些问题:

def save(self, **kwargs):
    Tournament(title = self.title)
上面的最后一行是什么也不做。您实例化了锦标赛的一个实例,但没有将其保存到变量中。实际上,您已经有了一个锦标赛的实例(如果是这种情况,则称为self)

在这里,您将遍历数据库中的所有播放器,无论它们是否与您的查询匹配

这真是效率低下

在下一行中,您有
member\u of\u tournament=member.tournament\u set.filter(title=self.title)
。这是复数形式,因此您应该将其称为锦标赛的成员,因为这是一个数组/列表/查询集

老实说,我不确定其余的策略是什么,但我只想说,你可能不应该这样做

您应该了解整个自定义保存方法,在您看来,您应该这样做:

tournament = Tournament(title=title)
tournament.save()
players_i_care_about = [players, go, here]

tournament.players = players_i_care_about #(removes all players and saves new players)


原因是,您的视图知道哪些球员属于哪个锦标赛,但您的模型应该不知道该逻辑。

我认为您在这里有一些问题:

class Tournament(models.Model):
    title = models.CharField(max_length = 100, verbose_name = u"Tournament's title")
    players = models.ManyToManyField(Player,verbose_name = u"Tournament's players")

    def __unicode__(self):
        return self.title

    def save(self, **kwargs):
        Tournament(title = self.title)
        all_players = Player.objects.all()
        for member in all_players:
            member_of_tournament = member.tournament_set.filter(title = self.title)
            for j in member_of_tournament:
                print member.tournament_set.filter(title = self.title)
                self.players.add(member)

        super(Tournament, self).save(**kwargs)
一般来说,您不希望在模型保存方法中使用m2m关系(在本例中,在任何情况下,其逻辑都不是很好)

save方法本身存在一些问题,因此让我来解决这些问题:

def save(self, **kwargs):
    Tournament(title = self.title)
上面的最后一行是什么也不做。您实例化了锦标赛的一个实例,但没有将其保存到变量中。实际上,您已经有了一个锦标赛的实例(如果是这种情况,则称为self)

在这里,您将遍历数据库中的所有播放器,无论它们是否与您的查询匹配

这真是效率低下

在下一行中,您有
member\u of\u tournament=member.tournament\u set.filter(title=self.title)
。这是复数形式,因此您应该将其称为锦标赛的成员,因为这是一个数组/列表/查询集

老实说,我不确定其余的策略是什么,但我只想说,你可能不应该这样做

您应该了解整个自定义保存方法,在您看来,您应该这样做:

tournament = Tournament(title=title)
tournament.save()
players_i_care_about = [players, go, here]

tournament.players = players_i_care_about #(removes all players and saves new players)


原因是,您的视图知道哪些玩家属于哪个锦标赛,但您的模型应该与该逻辑无关。

因为当您执行锦标赛的成员=成员。锦标赛设置。过滤器(title=self.title)对象时,第一次还没有保存。你可以尝试移动超级(锦标赛,自我)。保存(**kwargs)上面的循环。我已经尝试过了。不起作用。因为当您执行\u锦标赛的成员\u=member.tournament\u set.filter(title=self.title)对象时,尚未在第一次保存。你可以尝试移动超级(锦标赛,自我)。保存(**kwargs)上面的循环。我已经尝试过了。没用,回答得好。我会做一个修改:
all\u players=Player.objects.all()
可以是
my\u players=self.Player\u set.all()
回答得好。我会做一个修改:
all\u players=Player.objects.all()
只能是
my\u players=self.Player\u set.all()