Django似乎是为模型对象生成UUID的缓存函数

时间:2013-11-14 05:44:15

标签: django django-models uuid

我正在使用以下代码为模型对象的每个新实例生成一个UUID:

def make_uuid(type):
    """Takes an entity type identifier string as input and returns a hex of UUID2 with a 
    type identifier pre-pended for readability"""

    return str(type)+str(uuid.uuid1().hex)

模型字段:

account_uuid = models.CharField(max_length=34, default=make_uuid('AC'), db_index=True, unique=True)

当我实际运行应用程序时,第一次尝试很有效,但第二次和所有后续尝试都失败,并显示以下消息:

  

异常类型:IntegrityError

     

异常值:重复键值违反唯一约束   “accounts_accounts_account_uuid_key”

关于可能发生的事情的任何想法?

1 个答案:

答案 0 :(得分:0)

您正在将make_uuid调用的结果而不是可调用对象传递给默认值。

您的代码等于以下代码。

default_uuid = make_uuid('AC')
account_uuid = models.CharField(max_length=34, default=default_uuid, db_index=True, unique=True)

Field.default

  

字段的默认值。这可以是值或可调用的   宾语。如果是可调用的,则每次有新对象时都会调用它   创建

您可以使用partial或lambda生成新的uuid函数。

from functools import partial
account_uuid = models.CharField(
    max_length=34, 
    default=partial(make_uuid,'AC')
)