1

我在其中执行了以下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功能以某种方式被缓存。

4

2 回答 2

5

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

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)

这将在每次保存条目时生成随机字符。

于 2013-05-11T18:08:15.837 回答
2

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

于 2014-01-19T20:37:09.353 回答