2013-05-11 58 views
1

我做了我的model.py下生成一個唯一的標識符,它:可以正確地生成唯一標識符的Django模型

12 def rand_key(size): 
13  return ''.join([random.choice(string.letters + string.digits) for i in range(size)]) 
14 
15 
16 class Share(models.Model): 
17 
20  resource_content_type = models.ForeignKey(ContentType) 
21  resource_object_id = models.PositiveIntegerField() 
22  resource_content_object = generic.GenericForeignKey('resource_content_type', 'resource_object_id') 
23 
24  identifier = models.CharField(max_length=16,unique=True,default=rand_key(16)) 

的事情是,當嘗試保存連續兩個記錄,錯誤消息duplicate key value violates unique constraint "share_share_identifier_key"流行向上。我相信這是一個共同的特點。

我在做什麼錯了?

感謝

編輯:讓我補充的第一條記錄沒有任何問題創建和標識符字段具有propoerly「隨機」值。是在發生衝突的第二條記錄的結尾。看來rand_key函數是以某種方式緩存的。

回答

4

問題是您正在將隨機函數的輸出分配給默認參數。然後,所有條目的值將相同。試試這個代碼

def rand_key(size): 
    return ''.join([random.choice(string.letters + string.digits) for i in range(size)]) 


class Share(models.Model): 
    resource_content_type = models.ForeignKey(ContentType) 
    resource_object_id = models.PositiveIntegerField() 
    resource_content_object = generic.GenericForeignKey('resource_content_type', 'resource_object_id') 
    identifier = models.CharField(max_length=16, unique=True) 

    def save(self, force_insert=False, force_update=False, using=None, 
     update_fields=None): 
     if self.identifier is None: 
      self.identifier = rand_key(16) 
     models.Model.save(self, force_insert, force_update, using, update_fields) 

這會在每次保存一個條目時產生隨機字符。

1

對穆罕默德K K的答案的一些更正(將有評論但不允許)。這將覆蓋模型保存方法,並會在第一次保存模型時添加唯一ID。

def save(self, force_insert=False, force_update=False, using=None, 
     update_fields=None): 
     if self.identifier is None or len(self.identifier) == 0: 
      self.identifier = rand_key(16) 
     models.Model.save(self, force_insert, force_update, using, update_fields) 

我需要傳遞self作爲保存的第一個參數,並檢查標識符是空字符串還是空值。我不知道是什麼導致了這些差異,或者如果他的回答不打算用於vertatim ...我使用Django 1.6和Python 2.6。