模型中的Django Auto UUID不是唯一的

时间:2015-02-09 12:42:35

标签: django django-models

不确定这是否是Django中的错误,或者它不支持我正在尝试做的事情(或者我是如何做的)。

我模特的片段:

class UserProfile(models.Model):
    user = models.OneToOneField(User, primary_key=True, related_name='profile'
    login_hash = models.CharField(max_length=36, blank=True, null=True, default=uuid.uuid4())
    ...

如您所见,我已将login_hash的默认设置设为uuid.uuid4()的调用

工作正常...但是,多次调用UserProfile(快速创建新用户,即使看似几分钟,但我还没有正式时间)将导致多个用户使用相同的login_hash

似乎django(我在1.7.4)正在缓存uuid4()的结果一段时间。对我正在做的事情不利。

解: 我正在使用。我只是在数据库上设置了一个'on insert'触发器,这样当我插入一条新记录时,数据库就会生​​成UUID,但仅限于插入/新记录。

有没有办法在django中做到这一点,以便我可以保持数据库不可知?

1 个答案:

答案 0 :(得分:7)

  

工作正常...但是,对UserProfile的多次调用(快速创建新用户,即使看似几分钟,但我不是正式时间)将导致多个用户使用相同的login_hash。

由于代码是当前编写的,因此您导入了uuid.uuid4()UserProfile。它将被调用一次,结果值将成为所有新创建的默认值。

您改为做什么是将可调用作为默认值传递。像这样:default=uuid.uuid4

此外,对于CharField我强烈建议不要允许NULL值以及空值。它还不清楚你是否真的想要允许这个字段的空白值,但让我们假设你这样做。你应该最终得到这个:

login_hash = models.CharField(max_length=36, blank=True, default=uuid.uuid4)