可以正确地生成唯一标识符的Django模型

问题描述:

我做了我的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函数是以某种方式缓存的。

问题是您正在将随机函数的输出分配给默认参数。然后,所有条目的值将相同。试试这个代码

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) 

这会在每次保存一个条目时产生随机字符。

对*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。