数据库更新怪异

时间:2014-02-04 13:32:18

标签: mysql django django-models

我正在Django开发一款游戏,其中反叛者的数量在转弯后更新。反叛在(MySQL)数据库中表示为0到100之间的整数。

当我保存时,会发生这种情况:

print world.rebels
>>> 0

rebstab = 0
world.rebels += rebstab
world.save()

print world.rebels
>>> 0

然而,当我使用F()表达式时(因为我收集我应该防止竞争条件),会发生这种情况:

print world.rebels
>>> 0

rebstab = 0
world.rebels = F('rebels') + rebstab
world.save()

print world.rebels
>>> 100

发生了什么事?

2 个答案:

答案 0 :(得分:0)

我对使用F()这样的对象没有任何经验,所以这个答案可能没有用,但是having a look at the documentation it mentions

  

为了访问以这种方式保存的新值,需要重新加载该对象:

reporter = Reporters.objects.get(pk=reporter.pk)

因此您可能需要再次实际查询数据库以查看更新的值:

print world.rebels
>>> 0

rebstab = 0
world.rebels = F('rebels') + rebstab
world.save()

print World.objects.get(pk=world.pk)
>>> 100

编辑:另请参阅[您不需要将对象拉入内存并且可以在数据库级别执行每个操作的示例:

World.objects.get(pk=...).update(rebels=F('rebels) + 1)

答案 1 :(得分:0)

我只是弄清楚原因与F()对象本身无关,而是与自定义保存方法冲突。有关更深入的解释,请参阅Django F() objects and custom saves weirdness