您好,匿名用户

django使用F()处理竞争条件时怎么保证上限?

0 投票

比如有这样一个模型:

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?

用户头像 提问 5月29日 @ Wukong 上士 (1,850 威望)
分享到:

1个回答

0 投票
 
最佳答案

重新model save方法

from django.core.exceptions import ValidationError


class Memo(models.Model):
    top = ...
    num = ...
    
    def save(self, *args, **kwargs):
        if self.num > self.top:
            raise ValidationError("Number must be less than top.") 
        return super(Demo, self).save(*args, **kwargs)
用户头像 回复 5月29日 @ Annie 中士 (1,454 威望)
选中 5月16日 @Wukong
提一个问题:

相关问题

0 投票
1 回复 57 阅读
用户头像 提问 2016年 1月31日 @ Leo 中士 (1,325 威望)
0 投票
1 回复 91 阅读
用户头像 提问 2016年 2月2日 @ Caster 下士 (806 威望)
0 投票
1 回复 9 阅读
0 投票
1 回复 77 阅读
用户头像 提问 2016年 2月5日 @ Poppy 中士 (1,295 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...