Skip to main content
 首页 » 编程设计

python之Django:覆盖保存方法以处理 unique=True IntegrityError

2024年08月23日33shanyou

我的模型有一个 CharField,默认为随机生成的字符串,该字符串应该是唯一的。我不想使用 UUIDField。如果生成的代码重复,是否可以覆盖保存方法来处理 IntegrityError ?或者我应该在我的生成函数中检查它吗?

模型

class Item(models.Model): 
    ... 
    item_code = models.CharField(max_length=11, default=get_generated_code, unique=True) 

功能

def get_generated_code(): 
    code = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(11)) 
    return code 

请您参考如下方法:

这就是我最终所做的。

我覆盖了保存方法,以便在其中设置代码并检查完整性错误,这只会在 3 次不成功的尝试后引发它。由于碰撞的可能性足够小,尤其是在连续尝试 3 次之后,我觉得这是一个足够的解决方案,而不是在替代解决方案中进行多个数据库查询。

class Item(models.Model): 
    ... 
    # blank = True as this is handled by save method 
    code = models.CharField(max_length=11, blank=True, unique=True) 
 
    def save(self, *args, **kwargs): 
        if not self.code: 
            self.code = get_generated_code() 
        success = False 
        errors = 0 
        while not success: 
            try: 
                super(Item, self).save(*args, **kwargs) 
            except IntegrityError: 
                errors += 1 
                if errors > 3: 
                    # tried 3 times, no dice. raise the integrity error and handle elsewhere 
                    raise 
                else: 
                    self.code = get_generated_code() 
            else: 
                success = True