Django属性不是最新的

时间:2015-08-06 19:57:39

标签: python django

我正在使用Django / Postgresql,我想构建某种媒体播放器行为:在被问到时开始播放,播放直到进一步命令,并在被问到时停止播放。

我的Django模型设计如下:

  • 布尔属性 state
  • 一个切换 state 值的函数,如果是,则调用循环函数
  • 一个在 state 属性为True时循环的函数,在它为False时停止。

代码如下:

state = models.BooleanField(default=False)

def switchState(self):
    print 'switching from %s to %s' % (self.state, not(self.state))
    self.state = not(self.state)
    self.save()
    if self.state :
        self.loop()

def loop(self):
    while self.state:
        print 'looping'
        time.sleep( 1 )
        print 'stopped looping'

行为:

  • 当我在模型实例上调用switchState()时, state 设置为True(我可以在数据库中看到它)并且loop()函数开始打印行
  • 当我再次调用switchState()时, state 设置为False(再次,我可以在数据库中看到它),但是,loop()函数不会停止。当我打印状态时,其值仍为True ...

我无法获得该死的属性的最新值。 我一定错过了什么,但是什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

好的,我终于找到了答案。正如丹尼尔罗斯曼告诉我的那样,问题由于循环函数而导致,循环函数在自己的事务中循环,无法查看另一个事务中发生的事情。

我首先尝试使用新的refresh_from_db()函数强制刷新我的实例,但这根本不起作用(我仍然不明白为什么,请告诉我,如果你知道的话)。

正如Daniel建议的那样,我再次阅读了Django事务文档,最后找到了一个似乎有效的解决方案。我们的想法是允许循环函数使用带有transaction.atomic()命令的更新每个循环的实例。

tableView.setItems(data)

Nb:你不能用

TableView

而不是

List

也许这不是正确的做法,如果我错了,请随时纠正我。