0

给定一个我定义的表 xyz,我db.define_table('xyz'..)可以将其引用为 db.xzy,我如何向这个已经定义的表对象添加一个新字段?

我正在考虑的用例是我想将一个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)
4

2 回答 2

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对象的副本,并且可以指定一组新的参数来更改其某些属性。

有关多个字段的重用,请参阅有关表继承的文档。

于 2013-10-01T15:25:27.663 回答
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
于 2013-10-01T07:47:12.277 回答