django模型中的自动计算字段

时间:2011-05-10 17:13:54

标签: django django-models

每次创建新锦标赛时,我都会尝试在下面的模型中计算回合字段,但为了做到这一点,我首先需要参与的玩家数量:

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)            

但是虽然添加了新玩家但没有打印任何值。

注意:我正在通过管理网站进行所有锦标赛管理。

1 个答案:

答案 0 :(得分:1)

我认为这里的关键不是触发保存模型,而是触发m2m。幸运的是,有一个信号:m2m_changed。该信号的instance参数是正在更改的模型实例(此处为锦标赛实例)。