2.11.1. represent

フィールドの読み出し時に動作するオプションです。これは Field クラスのコンストラクタに設定します。

具体的なサンプルを見ていきましょう。

db.define_table('person',
    Field('name',represent=lambda v : v+'-san'),
    format='%(name)s')

テーブル定義で、フィールドnameのrepresentオプションに無名関数(lambda)を登録しています。無名関数のパラメータは、 データベースから取り出したフィールド値になります。

設定したrepresentの使用方法は2つあります。

  1. Fieldクラスのrepresent属性を呼び出します。

    represent属性を呼び出しフィールド値を渡します。

    >>> for row in db(db.person).select():
    ...     print row.name, db.person.name.represent(row.name)
    Pocomaco Pocomaco-san
    Satocoto Satocoto-san
    Codatada Codatada-san
    

    これは通常の関数呼び出しと、何ら変わりません。

  2. SQLTABLEを使用します。

    SQLTABLEではフィールド値をrepresentで設定した関数に自動変換して表示します。リスト表示のサンプルを作ってみます。

    def person_list():
        rows = db(db.person).select()
        return dict(rows=rows)
    

    実際に動かしてみた結果は次のようになります。

    ../../../_images/web2py_dal_012r.PNG

    SQLTABLEはrepresentに設定した関数に対して、パラメータを2つ渡します。 一つはフィールドの値ですが、もう一つはレコードが入った Row オブジェクトです。 このためrepresentを、次のようにパラメータ2つでも定義できます。

    db.define_table('person',
        Field('name', represent=lambda v, r : str(r.id)+'-'+v+'-san'),
        format='%(name)s')
    

    2番目のパラメータによって、representを定義したフィールドだけでなく、レコードの他のフィールドも参照可能です。動作結果は次のようになります。

    ../../../_images/web2py_dal_033r.PNG

実はrepresentは define_table()format オプションでも使われています。formatオプションで設定した テーブルの表示方法を、そのテーブルに対して参照しているフィールドのrepresent属性に設定する仕組みなのです。

../../../_images/web2py_dal_013r.JPG

このためrepresentは formatオプションの動作 と同様の動きをします(本当はformatがrepresentと同様の動きをします)。