當處理繼承db.Model的類時,添加方法是否更好,或者我應該創建一個單獨的類?我應該將方法添加到繼承db.Model的類中,還是應該將這些類繼承爲新類?
例如,如果我想在存儲信息的帖子,我應該已經張貼延長db.Model,或者我應該已經POSTDATA延長db.Model和擴展後(甚至引用?)POSTDATA?
我認爲,區別在於繼承db.Model的類不會創建沒有所有必需屬性的實例。我希望看到的行爲不是將保存到沒有必需屬性的數據存儲區。哪個更清潔?哪一個是首選?
當處理繼承db.Model的類時,添加方法是否更好,或者我應該創建一個單獨的類?我應該將方法添加到繼承db.Model的類中,還是應該將這些類繼承爲新類?
例如,如果我想在存儲信息的帖子,我應該已經張貼延長db.Model,或者我應該已經POSTDATA延長db.Model和擴展後(甚至引用?)POSTDATA?
我認爲,區別在於繼承db.Model的類不會創建沒有所有必需屬性的實例。我希望看到的行爲不是將保存到沒有必需屬性的數據存儲區。哪個更清潔?哪一個是首選?
添加方法db.Model
子類是完全沒有問題的做法。如果您有幾個模型類可以共享的常見功能,就像在標準繼承中一樣,讓您的實際模型子類本身是一個db.Model
子類是唯一的要點。
我不確定您的建議方法如何幫助您「不保存到沒有必需屬性的數據存儲區」,除非您打算創建自己的數據模型,而這些數據模型可以從數據存儲區模型轉換到數據存儲區模型 - 這只是將會浪費大量時間(包括你的和處理器的)。數據存儲庫的工作方式,不可能創建一個模型,其中的值不會被驗證,我不確定爲什麼您想要。
提示:使用從數據存儲模型
我覺得他們是在最純粹的形式,你應該用你的模型分離的業務邏輯。
您可以使其他處理程序將它們用作顯式類型。 有些清潔劑不會繼承它們。想想數據連接。您可以在斷開連接或連接狀態下使用模型。
在紅寶石我會用混入或concerned_with圖案模型
在Python中我建議使用Django,所以你的觀點可能包含業務邏輯的大部分。 http://www.djangobook.com/en/1.0/chapter05/
嘗試使用mixins!
mixin類是一種使用類的繼承能力來組成一個類的方法,它們由較小的行爲組成。
https://docs.djangoproject.com/en/dev/ref/class-based-views/
另一種方法是使用組合(通常是繼承的更好的選擇)。例如
class MyModel(db.Model): pass
# Avoiding inheritance.
class MyWrapper(object):
def __init__(self, my_model):
# The leading _ indicates that methods in this class should
# access self._my_model.
self._my_model = my_model
很多人會認爲這是不必要的間接方式,我不會責怪那些人。不過,如果您想以db.Property
中的validator
參數不支持的方式約束MyModel
實例,這可能會很好。例如。
class MyModel(db.Model):
# f(x, y, z) = 0
x = db.FloatProperty()
y = db.FloatProperty()
z = db.FloatProperty()
沒有強制執行的MyWrapper
幫助約束將是更難。
使用包裝的另一個原因是你想實現自己的緩存方案,儘管ndb
以更一般的方式解決了這個問題。當MyModel
只能通過MyWrapper
操縱時,那麼你可以控制什麼樣的突變是可能的。然後,您可以根據需要注意使緩存條目無效。