2013-10-01 41 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 
相关问题