Django模板中的UUID默认值

2024-05-14 00:36:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我注意到django模型中默认值的奇怪行为。例如,我们有一个简单的django模型:

import uuid
...

class SiteUser(models.Model):
    ...
    username = models.CharField(max_length=255, verbose_name=u"Username")
    activation_key = models.CharField(max_length=64, verbose_name=u"Activation key", default=uuid.uuid1())

当我创建一个新用户,然后是另一个这样的用户:

user_a = SiteUser(username="UserA")
user_a.save()
user_b = SiteUser(username="UserB")
user_b.save()

Django让两个用户使用相同的activation_key

但后来我就这样做了:

user_a = SiteUser(username="UserA")
user_a.activation_key = uuid.uuid1()
user_a.save()
user_b = SiteUser(username="UserB")
user_b.activation_key = uuid.uuid1()
user_b.save()

一切正常,Django创建了两个具有不同激活密钥的用户。

怎么回事?Python加载模型对象并在wsgi应用程序启动时计算模型的默认值,还是这样?为什么uuid在第一种情况下给出相同的值,而在第二种情况下给出不同的值?

谢谢。


Tags: djangokey用户模型uuidmodelssaveusername
2条回答

从Django 1.8开始,有一个新的UUIDField可用。下面的链接中介绍了如何设置默认值:

https://docs.djangoproject.com/en/1.8/ref/models/fields/#uuidfield

问题是您设置为的default属性

activation_key = models.CharField(max_length=64, verbose_name=u"Activation key",
                 default=uuid.uuid1())

在这里,您将默认值设置为不可调用,而是在初始化该模型类时由uuid.uuid1()调用返回的值。

您应该将其设置为default=uuid.uuid1,这将其设置为可调用的,并且在每次需要使用新的默认值时设置新的uuid。

相关问题 更多 >