不确定这是否是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中做到这一点,以便我可以保持数据库不可知?
答案 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)