Django F()对象和自定义保存了奇怪

2024-10-01 09:36:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在使用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) > 100True,并触发了对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()对象时避免我的自定义保存,然后使用正确的值强制我的自定义保存。在

这是预期的行为吗?如果是的话,有没有更简单的方法来完成我要做的事情?在


Tags: 对象方法模型selfworldifmodelssave
1条回答
网友
1楼 · 发布于 2024-10-01 09:36:17

在Python中比较不同类型时,数字总是排在其他对象之前。因此,100总是低于F()对象。在

您确实需要对此进行特殊情况的测试;您可以测试self.rebels是否是{}的实例:

def save(self, *args, **kwargs):
    ...
    if not isinstance(self.rebels, F):
        if self.rebels > 100:
            self.rebels = 100
        elif self.rebels < 0:
            self.rebels = 0  
    ...
    super(World, self).save(*args, **kwargs)

Python2这样做是为了支持混合类型的排序列表,同时保证一个稳定的排序顺序。在

因为这种行为可能会导致细微的意外错误(与您的情况完全相同),因此在python3中已经删除了这种行为,并且只支持显式支持比较的类型。在

相关问题 更多 >