2016-05-26 22 views
1

私はauth_userテーブルにuuidフィールドを追加し、以下のように、web2py_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 

私は上記の方法で作成した各ユーザーは、ユーザーが作成されるたびに呼び出されますweb2py_uuidユニークなUUID(すなわちを持っているだろうという印象の下にありました、毎回ユニークな出力が生成されることに注意してください)。 create_profile()の1回の呼び出しで生成されるすべてのユーザーでUUIDの値が均一であることが予想されますか?上記の例のようにdefaultパラメータを使用すると、各ユーザーが一意のuuid値を持つことを保証する方法はありますか?

答えて

3

web2py_uuid()関数を呼び出すと、1つのUUIDを生成し、それをフィールドのデフォルト値として設定します。その値は要求全体のデフォルトとして保持されるため、その要求中に挿入されたレコードはすべて同じUUIDを取得します。インサートごとに個別のデフォルト値を生成する場合は、代わりに関数をデフォルトとして指定する必要があり、DALは各インサートでその関数を自動的に呼び出します。だから、それは次のようになります。

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

注意、default=web2py_uuidではなくdefault=web2py_uuid()

フィールドのデフォルト値を設定しますdefault:ドキュメントから

。値が明示的に指定されていない場合、挿入を実行するときにデフォルト値が使用されます。これは、SQLFORMを使用してテーブルから作成されたフォームの事前入力にも使用されます。固定値ではなく、デフォルトでは、フィールドに適切な型の値を返す関数(ラムダ関数を含む)を使用できます。この場合、挿入されたレコードごとに関数が1回呼び出されます。複数のレコードが1つのトランザクションに挿入されている場合でも機能が呼び出されます。

+0

ありがとうございました! – Boa

関連する問題