2013-11-09 72 views
1

我有兩個與ManyToMany關係的模型。下面是代碼:保存()在ManyToMany關係

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) 

當我保存錦標賽首次將其保存的標題。但是當我下次節省時,它也可以節省玩家並將他們與錦標賽聯繫起來。我怎樣才能在錦標賽的同時保存它們?

+0

因爲當你在做member_of_tournament = member.tournament_set.filter(title = self.title)的時候,第一次沒有保存對象。你可以嘗試移動超級(錦標賽,自我).save(** kwargs)以上for循環。 – Mutant

+0

我已經試過了。沒有幫助。 –

回答

4

我覺得你有一些問題在這裏:

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的關係(在這種情況下,它的邏輯ISN」噸無論如何很棒)

你必須在保存方法本身的一些問題,所以讓我解決這些:

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) 

在這裏,您遍歷數據庫中的所有玩家,無論它們是否與您的查詢匹配。

這實在是效率低下。

在下一行中,您有member_of_tournament = member.tournament_set.filter(title = self.title)。這是複數,所以你應該調用這個members_of_tournament,因爲這是一個數組/列表/查詢集。

我真的不知道其餘的策略是什麼,但可以說,你不應該這樣做,可能。

你應該只得到整個自定義的保存方法,在你考慮乘坐正在推動這個,你應該做這樣的事情:

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) 

for player in players_i_care_about: 
    tournament.players.add(player) #(only adds these players, doesn't remove any players) 

這樣做的原因,你的觀點知道哪些球員屬於哪個錦標賽,但是你的模型應該是不可知論的邏輯。

+0

很好的答案。我會做一個修改:'all_players = Player.objects.all()'可以只是'my_players = self.player_set.all()' – karthikr