每次创建新锦标赛时,我都会尝试在下面的模型中计算回合字段,但为了做到这一点,我首先需要参与的玩家数量:
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()
问题似乎是如果 super 未保存,则无法访问其m2m字段:
'锦标赛'实例需要有一个 a之前的主键值 可以使用多对多关系。
有什么建议吗?
_
我已经测试了
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)
谢谢;)
编辑:
即使使用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 :(得分:1)
我认为这里的关键不是触发保存模型,而是触发m2m。幸运的是,有一个信号:m2m_changed
。该信号的instance
参数是正在更改的模型实例(此处为锦标赛实例)。