web2py_uuid() 在多次调用中返回相同的值?

web2py_uuid() returning same value over multiple invocations?

我在 auth_user table 中添加了一个 uuid 字段,并将该字段的 default 值设置为 web2py_uuid(),如下所示以下:

模块:

class User_Custom(Base):
    def __init__(self, ...):
        ...
        auth.settings.extra_fields['auth_user']= [
            Field('uuid', type='string', default = web2py_uuid(), 
                        readable=False, writable=False, label=current.T('UUID')),
                ]

我正在使用一些自定义函数来填充我的数据库,并发现 auth_user 中的每个用户都以相同的 uuid 值结束。

`populate.py'模型文件:

def create_user():
    user_dict = dict(
          first_name = random.choice(FIRST_NAMES),
          last_name = random.choice(LAST_NAMES),
          email = ...,
          password = ..,
          )
    return db.auth_user.insert(**user_dict)

def create_profile(count = 100):
    for idx in range(count):
        user_id = create_user()
        # create a bunch of data for tables referenced by db.auth_user

我的印象是,以上述方式创建的每个用户都会有一个唯一的 uuid(即每次创建用户时都会调用 web2py_uuid,并且每次都会生成一个唯一的输出时间)。一次调用 create_profile() 生成的所有用户的 uuid 值都是统一的,这是预期的行为吗?有没有办法保证每个用户在使用上例中的 default 参数时都有唯一的 uuid 值?

通过调用 web2py_uuid() 函数,您将生成一个 UUID,然后将其设置为该字段的默认值。该值将保留为整个请求的默认值,因此在该请求期间插入的任何记录都将获得相同的 UUID。如果你想为每个插入生成一个单独的默认值,你必须提供一个函数作为默认值,DAL 将在每次插入时自动调用该函数。所以,应该是:

Field('uuid', default=web2py_uuid, ...)

注意,default=web2py_uuid 而不是 default=web2py_uuid()

来自文档:

default sets the default value for the field. The default value is used when performing an insert if a value is not explicitly specified. It is also used to pre-populate forms built from the table using SQLFORM. Note, rather than being a fixed value, the default can instead be a function (including a lambda function) that returns a value of the appropriate type for the field. In that case, the function is called once for each record inserted, even when multiple records are inserted in a single transaction.