我在我的model.py
中做了以下操作来为它生成一个唯一标识符:
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"
弹出。我相信这是一个普遍的特征。
我做错了什么?
感谢编辑:让我添加第一个记录是没有任何问题创建的,标识符字段有一个适当的"随机"值。是在创建第二个发生冲突的记录时。似乎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)
这将在每次保存条目时生成随机字符。
对Muhammed 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作为保存的第一个参数,并检查标识符是空字符串还是null。我不知道是什么原因导致了这些差异,或者他的回答不是为了竖着用……我使用的是Django 1.6和python 2.6