比如有这样一个模型:
class Demo(models.Model):
top = models.IntegerField()
num = models.IntegerField(default=0)
先产生一条初始的记录:
demo = Demo.objects.create(top=10)
之后通过F()
表达式对num
进行更新避免竞争,但又要保证num
不大与top
。
# 客户端1
demo_obj = Demo.objects.get(pk=1) # top: 10, num: 8
demo_obj.num = F('num') + 2
demo_obj.save()
# 客户端2
demo_obj = Demo.objects.get(pk=1) # top: 10, num: 8
demo_obj.num = F('num') + 1
demo_obj.save()
上面两个客户端同时操作,由于使用了F()
表达式,demo_obj.num
是一个表达式对象,具体的更新操作交由数据库处理了。
这种情况怎么保证num
在累加的时候不能超过top
?