我已在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值,如上例所示?
答案 0 :(得分:3)
通过调用web2py_uuid()
函数,您将生成单个UUID,然后将其设置为该字段的默认值。该值将作为整个请求的默认值保留,因此在该请求期间插入的任何记录都将获得相同的UUID。如果要为每个插入生成单独的默认值,则必须提供一个函数作为默认值,DAL将自动在每个插入上调用该函数。所以,它应该是:
Field('uuid', default=web2py_uuid, ...)
注意,default=web2py_uuid
而不是default=web2py_uuid()
。
来自文档:
default
设置字段的默认值。如果未明确指定值,则在执行插入时使用默认值。它还用于使用SQLFORM
预填充从表中构建的表单。注意,默认值可以是函数(包括lambda函数),而不是固定值,它返回字段的相应类型的值。在这种情况下,即使在单个事务中插入多个记录,也会为插入的每个记录调用一次该函数。