2012-03-07 56 views
2

這是正確的嗎?在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() 

回答

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()時纔會執行。

您也可以使用old style virtual fields來做到這一點,這對於複雜的功能可能會更好。

請注意,這與Django的處理方式不同,因爲web2py使用數據庫抽象層(DAL)而不是ORM。表不是建模爲自定義類,而是作爲DAL Table類的實例。

+0

好,這可能是一些可以幫助我實現我想要的一部分 - 它可以顯着提高web2py的模型對我的可用性。但**是否有可能添加實際上比行更多的參數的自定義方法?**是否有任何與這些方法有關的問題?您引用的文檔說:「_注意採用單個參數(self)的類的每種方法都是新的虛擬字段。」。這是否意味着如果我試圖實施像'aircraft.fly(speeds.FAST,dirs.NORTH)'(更多參數)一樣使用的方法,那麼我會在某個時候碰壁? – Tadeck 2012-03-07 19:55:14

+0

請注意,新樣式的懶惰虛擬字段在被調用時可以採用其他參數。請參閱Field.Lazy示例[此處](http://web2py.com/books/default/chapter/29/6#New-style-virtual-fields-%28experimental%29)。你也許可以用老式的懶惰虛擬字段指定附加參數,但我沒有嘗試過。 – Anthony 2012-03-07 21:27:30

+0

感謝您的意見。我現在接受你的答案作爲回答我的問題的答案。我還有其他問題可以回答:[我可以在Web2Py中包含局部視圖,將特定變量傳遞給它?](http://stackoverflow.com/questions/9674630/can-i-include-partial-view-in- web2py中,通過特定的變量 - 到 - 它)。在官方文件中我沒有找到任何幫助。 – Tadeck 2012-03-12 20:56:09

相關問題