是否正确,在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()
答案 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
类的实例。