2013-10-01 99 views
0

假設我已經通過db.define_table('xyz'..)定義了表xyz,我可以引用爲db.xzy,那麼如何向此已定義的表對象添加新字段?如何將字段添加到web2py中已定義的表中?

我正在考慮的用例是我想爲幾個表添加一個created字段。我也想避免重複自己。我的想法是創建一個函數,它將一張表格添加到created字段中。因此,例如:

def addcreated(table): 
    # ??? somehow add a new Field('created', 'datetime') to table 
    table.created.writable = False 
    table._before_insert.append... 
    ... etc. 

db.define_table('product', 
    Field('name','string'), 
    Field('weight','double') 
) 

db.define_table('customer', 
    Field('name','string'), 
    Field('address','string') 
) 

addcreated(db.product) 
addcreated(db.customer) 

回答

3
created_field = Field('created', 'datetime', writable=False) 

db.define_table('product', 
    Field('name','string'), 
    Field('weight','double'), 
    created_field) 

或:

db.define_table('product', 
    Field('name','string'), 
    Field('weight','double'), 
    created_field.clone(...)) 

隨着.clone()你得到一個Field對象的副本,並可以指定一組新的參數來改變它的一些屬性。

要重複使用多個字段,請參閱table inheritance上的文檔。

+0

'clone()'還可以與Table對象一起使用還是隻能使用單個字段? – User

+0

'.clone()'是Field類的一個方法。 「Table」類沒有任何相似之處。 – Anthony

+0

你也可以使用'* args'定義字段。您可以創建一個Field對象列表,並執行此操作:db.define_table('product',* fields)'。 – omar

2

也許你應該考慮使用db._common_fields.append(http://web2py.com/books/default/chapter/29/06/the-database-abstraction-layer?#Common-fields-and-multi-tenancy

例如,如果你想獲得您的記錄創建日期,你可以添加以下行之前你的表定義

signature = db.Table(db,'auth_signature', 
     Field('created_on','datetime',default=request.now, 
      writable=False,readable=False, label=T('Created on')), 
     Field('created_by','reference %s' % auth.settings.table_user_name,default=auth.user_id, 
      writable=False,readable=False, label=T('Created by')) 
    ) 

db._common_fields.append(signature) #db._common_fields is a list of fields that should belong to all the tables 
相關問題