模型中的 Django Auto UUID 不是唯一的
Django Auto UUID in Model not unique
不确定这是否是 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,但仅限于 inserts/new 条记录。
有没有办法在 django 中做到这一点,这样我就可以让它与数据库无关?
works fine... however, multiple calls to the UserProfile (creating new users quickly, even seemingly a few minutes, but i've not an official time) will result in the same login_hash for multiple users.
由于代码是当前编写的,您在导入 UserProfile
时调用 uuid.uuid4()
。它将被调用一次,结果值将成为所有新创建的默认值。
您要做的是默认传递 callable。像这样:default=uuid.uuid4
.
此外,对于 CharField
,我强烈建议不允许使用 NULL
值和空白值。也不清楚您是否真的希望此字段允许空白值,但我们假设您这样做了。你应该这样结束:
login_hash = models.CharField(max_length=36, blank=True, default=uuid.uuid4)
不确定这是否是 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,但仅限于 inserts/new 条记录。
有没有办法在 django 中做到这一点,这样我就可以让它与数据库无关?
works fine... however, multiple calls to the UserProfile (creating new users quickly, even seemingly a few minutes, but i've not an official time) will result in the same login_hash for multiple users.
由于代码是当前编写的,您在导入 UserProfile
时调用 uuid.uuid4()
。它将被调用一次,结果值将成为所有新创建的默认值。
您要做的是默认传递 callable。像这样:default=uuid.uuid4
.
此外,对于 CharField
,我强烈建议不允许使用 NULL
值和空白值。也不清楚您是否真的希望此字段允许空白值,但我们假设您这样做了。你应该这样结束:
login_hash = models.CharField(max_length=36, blank=True, default=uuid.uuid4)