【问题标题】:UUID as default value in Django modelUUID 作为 Django 模型中的默认值
【发布时间】:2014-09-14 15:48:56
【问题描述】:

我注意到 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 让 2 个用户使用相同的 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 使用不同的激活密钥创建了 2 个用户。

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

谢谢。

【问题讨论】:

标签: python django django-models


【解决方案1】:

从 Django 1.8 开始,有一个新的 UUIDField 可用。以下链接中对此进行了描述,该链接还介绍了如何设置默认值:

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

【讨论】:

    【解决方案2】:

    问题是您设置的default 属性

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2022-06-17
      • 2018-10-22
      • 1970-01-01
      • 2011-09-03
      • 2017-11-10
      相关资源
      最近更新 更多