2016-01-21 61 views
2

我的模型具有CharField默認爲隨機生成的字符串應該是唯一的。我不想使用UUIDField。如果生成的代碼是重複的,有沒有辦法覆蓋保存方法來處理IntegrityError?或者我應該檢查我的世代功能?Django的:重寫保存方法來處理獨特=真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 

回答

1

這是我落得這樣做。

我推翻save方法使得碼被設置內有和檢查完整性錯誤,只經過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