2.4. コモンフィールド(フィールドの継承)¶
全テーブルに含まれるフィールドのリストを定義することも可能です。この機能はコモンフィールドと呼ばれており、次のように設定します。
db._common_fields.append(Field('is_active','boolean',default=True))
この設定以降に定義したテーブルには、コモンフィールドで指定したフィールドが追加されます。つまり、次のように記述したモデル定義(db.pyなど)では、
db._common_fields.append(Field('is_active','boolean',default=True))
db.define_table('person',
Field('name'),
format='%(name)s')
db.define_table('dog',
Field('owner_id', db.person),
Field('name'))
personとdogテーブルそれぞれに、is_active フィールドが追加されます。
フィールドのリストではなく、テーブル定義を指定することも可能です。
def_animal = db.Table(db, 'animal',
Field('name'),
Field('owner_id', db.person))
db._common_fields.append(def_animal)
db.define_table('mouse')
db.define_table('rat')
mouseとratテーブルには、animalテーブルのnameとowner_idのフィールドが追加されます。
auth.signature を追加するには次のように指定します。
db._common_fields.append(auth.signature)
これによって各テーブルで指定しなくても、この記述以降に定義するテーブルには、auth.signature の全フィールドが追加されることになります。
コモンフィールドは、 コモンフィルタ と同時に使用することが多いです。この場合マルチテナントのための、次のフィールドを追加するため使用されます。
db._common_fields.append(Field('request_tenant',
default=request.env.http_host,writable=False))
request_tenant フィールドは特殊な機能を持っていますが、これはコモンフィルタで説明します。