模型中的Django自动UUID不唯一
不确定这是否是Django中的一个bug,或者它不支持我正在尝试做的事情(或者我是如何做的) 我的模型的一个片段:模型中的Django自动UUID不唯一,django,django-models,Django,Django Models,不确定这是否是Django中的一个bug,或者它不支持我正在尝试做的事情(或者我是如何做的) 我的模型的一个片段: 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=
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\u hash
的默认值设置为调用uuid.uuid4()
工作很好。。。但是,多次调用UserProfile(快速创建新用户,即使看起来只有几分钟,但我没有正式时间)将导致多个用户使用相同的login\u hash
django(我在1.7.4上)似乎正在缓存uuid4()
的结果一段时间。对我想做的不好
解决方案:
我正在用的。我只是在数据库上设置了一个“on insert”触发器,这样当我插入一条新记录时,数据库会生成UUID,但只在insert/new记录上生成
有没有一种方法可以在django中实现这一点,从而使其与数据库无关?
工作很好。。。但是,多次调用UserProfile(快速创建新用户,即使看起来只有几分钟,但我没有正式时间)将导致多个用户使用相同的登录\u哈希
当前编写代码时,您正在导入UserProfile
时调用uuid.uuid4()
。它将被调用一次,结果值将是所有新创建的默认值
相反,您要做的是传递一个callable作为默认值。类似这样:default=uuid.uuid4
另外,对于CharField
我强烈建议不允许NULL
值以及空白值。也不清楚您是否真的希望允许此字段为空值,但我们假设您确实希望。您应该以以下方式结束:
login_hash = models.CharField(max_length=36, blank=True, default=uuid.uuid4)
“拍额头”。。。当然讨厌一对牙套把事情搞砸了:)谢谢!