UUID 作为 Django 模型中的默认值

问题描述 投票:0回答:3

我注意到 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 个具有不同激活密钥的用户。

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

谢谢。

python django django-models
3个回答
36
投票

问题是您设置的

default
属性

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

在这里,您将默认值设置为不是可调用的,而是初始化此模型类时由

uuid.uuid1()
调用返回的值。

您应该将其设置为

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


13
投票

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

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


0
投票

使用 Django UUIDField

import import uuid

from django.db import models
class MyModel(models.Model):
    
    id = models.UUIDField(primary_key=True, default=str(uuid.uuid4()), editable=False, unique=True)
© www.soinside.com 2019 - 2024. All rights reserved.