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 フィールドは特殊な機能を持っていますが、これはコモンフィルタで説明します。

参考: Common fields and multi-tenancyコモンフィールドとマルチテナント