我一直在使用Django F()对象来更新我的模型,以避免竞争条件。在
我还为我的模型定制了一个保存方法(我希望叛军的范围从0到100)。在
下面是一些示例代码:
class World(models.Model):
...
world.rebels = models.IntegerField(default=0)
...
def save(self, *args, **kwargs):
...
if self.rebels > 100:
self.rebels = 100
elif self.rebels < 0:
self.rebels = 0
...
super(World, self).save(*args, **kwargs)
现在我有了一个函数,可以增加叛军人数。在
^{pr2}$真奇怪,对吧?增量值完全错误!然后,我注释掉了自定义保存方法,其中包含自我叛逆者,然后模型将正确的值保存到数据库中。
显然(+: (DEFAULT: ), 0) > 100
是True
,并触发了对100的更改。在
我已将自定义保存方法更改为:
def save(self, fsave=False, *args, **kwargs):
if fsave == False:
...
if self.rebels > 100:
self.rebels = 100
elif self.rebels < 0:
self.rebels = 0
...
super(World, self).save(*args, **kwargs)
在我的功能中,我会调用世界.save()两次:
world = World.objects.get(worldid=1)
rebchange = 0
world.rebels = F('rebels') + rebchange
world.save(fsave=True)
world.save()
print world.rebels
>>> 0
为了能够在保存F()对象时避免我的自定义保存,然后使用正确的值强制我的自定义保存。在
这是预期的行为吗?如果是的话,有没有更简单的方法来完成我要做的事情?在
在Python中比较不同类型时,数字总是排在其他对象之前。因此,
100
总是低于F()
对象。在您确实需要对此进行特殊情况的测试;您可以测试}的实例:
self.rebels
是否是{Python2这样做是为了支持混合类型的排序列表,同时保证一个稳定的排序顺序。在
因为这种行为可能会导致细微的意外错误(与您的情况完全相同),因此在python3中已经删除了这种行为,并且只支持显式支持比较的类型。在
相关问题 更多 >
编程相关推荐