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

时间:2016-05-26 16:55:04

标签: web2py

我已在uuid表中添加了auth_user字段,并将此字段的default值设置为web2py_uuid(),如下所示:< / p>

模块:

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&#39;模型文件:

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值,如上例所示?

1 个答案:

答案 0 :(得分:3)

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

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

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

来自文档:

  

default设置字段的默认值。如果未明确指定值,则在执行插入时使用默认值。它还用于使用SQLFORM预填充从表中构建的表单。注意,默认值可以是函数(包括lambda函数),而不是固定值,它返回字段的相应类型的值。在这种情况下,即使在单个事务中插入多个记录,也会为插入的每个记录调用一次该函数。