是否可以为Web2Py的内置“模型”添加自定义方法?

时间:2012-03-07 04:02:34

标签: django methods model web2py

是否正确,在Web2Py中你能够在“模型”中创建自定义方法,以便它们可以包含您希望模型实现的业务逻辑?

对于Django,您可以执行以下操作:

class Aircraft(models.Model):
    '''I am an aircraft. I can fly, if I am created in Django.
    '''
    name = models.CharField(max_length=20)
    def fly(self):
        # ... some advanced logic here ...
        return 'I am flying'

但是可以在Web2Py中执行类似的操作(创建自定义方法)而无需从头开始编写整个ORM系统或在所有表的实例之间共享单个方法吗?有没有确定的方法呢?例如:

db.define_table("aircrafts",
    Field("name", type="string", length=20)
)

aircraft = db(db.aircrafts).select().first()

# I am an aircraft too, please make me fly
aircraft.fly()

1 个答案:

答案 0 :(得分:2)

是的,您可以定义virtual fields

db.aircrafts.fly = Field.Virtual(lambda row: 'I am flying')
aircraft = db(db.aircrafts).select().first() 
print aircraft.fly

db.aircrafts.fly = Field.Lazy(lambda row: 'I am flying')
aircraft = db(db.aircrafts).select().first() 
print aircraft.fly()

在上面的第一个示例中,选择它们时,将自动为所有记录计算“fly”值。在第二个示例中,计算是惰性的,仅在特定记录上实际调用.fly()时执行。

您也可以使用old style virtual fields执行此操作,这可能更适合复杂功能。

请注意,这与Django的处理方式不同,因为web2py使用数据库抽象层(DAL)而不是ORM。表没有建模为自定义类,而是作为DAL Table类的实例。