2.11.1. represent¶
フィールドの読み出し時に動作するオプションです。これは Field クラスのコンストラクタに設定します。
具体的なサンプルを見ていきましょう。
db.define_table('person',
Field('name',represent=lambda v : v+'-san'),
format='%(name)s')
テーブル定義で、フィールドnameのrepresentオプションに無名関数(lambda)を登録しています。無名関数のパラメータは、 データベースから取り出したフィールド値になります。
設定したrepresentの使用方法は2つあります。
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
これは通常の関数呼び出しと、何ら変わりません。
SQLTABLEを使用します。
SQLTABLEではフィールド値をrepresentで設定した関数に自動変換して表示します。リスト表示のサンプルを作ってみます。
def person_list(): rows = db(db.person).select() return dict(rows=rows)
実際に動かしてみた結果は次のようになります。
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を定義したフィールドだけでなく、レコードの他のフィールドも参照可能です。動作結果は次のようになります。
実はrepresentは define_table()
の format オプションでも使われています。formatオプションで設定した
テーブルの表示方法を、そのテーブルに対して参照しているフィールドのrepresent属性に設定する仕組みなのです。
このためrepresentは formatオプションの動作 と同様の動きをします(本当はformatがrepresentと同様の動きをします)。