2011-05-10 120 views
0

我試圖計算場在下面的模式,每次新的比賽被創建,但要做到這一點,我首先需要玩家參與人數:自動計算領域

class Tournament(models.Model): 
    rounds = models.PositiveIntegerField() 
    players = models.ManyToManyField(User) 

    def save(self, *args, **kwargs): 
     self.rounds = self.players.count() + 3 
     super(Tournament, self).save() 

這些問題似乎是,如果超級是不是救了你不能訪問其M2M領域:

「比賽」實例需要一個之前必須有一個 主鍵值可以使用210多對多關係。

有什麼建議嗎?

_

我已經測試

def save(self, *args, **kwargs): 
     super(Tournament, self).save() 
     self.rounds = self.players.count() + 3 
     super(Tournament, self).save() 

players.count()總是返回0

* post_save *信號是另一個我嘗試,但我得到了一個美麗無限遞歸

def trigger_create_round(sender, **kwargs): 
    tournament = kwargs['instance'] 
    tournament.rounds = tournament.players.count() + 3 
    tournament.save() 

post_save.connect(trigger_create_round, sender=Tournament, weak=False) 

Tha NKS)


編輯:

即使使用m2m_changed信號問題仍然存在:

def trigger_create_round(sender, instance, action, reverse, model, pk_set, **kwargs): 
    if action == 'post_add': 
     for val in pk_set: 
      print val 

m2m_changed.connect(trigger_create_round, sender=Tournament.players.through, weak=False)    

但沒有印刷價值雖然添加了新的球員。

注:我正在通過管理網站進行所有錦標賽管理。

+0

'如果tournament.rounds!= tournament.players.count()+ 3:tournament.save()'只是一個想法來打破循環。可能是更好的方法。 – DTing 2011-05-10 18:22:23

+0

保存模型後保存多對多關係。這就是爲什麼你無法從模型的「保存」方法訪問計數。這樣做是因爲你無法保存多對多的關係而沒有模型的主鍵,如果碰巧是一個新的對象,它還沒有主鍵。 – 2011-05-10 20:57:04

回答

1

我覺得這裏的關鍵不是觸發保存模型,而是觸發m2m。幸運的是,有一個信號:m2m_changed。該信號的instance參數是正在更改的模型實例(這裏是比賽的實例)。

+0

+1爲透視軸:) – 2011-05-10 18:43:41

+0

即使使用m2m_changed信號,問題仍然存在。請在原始帖子中查看_Edit_。 – g0to 2011-05-22 17:26:07