2011-06-30 75 views
1

當處理繼承db.Model的類時,添加方法是否更好,或者我應該創建一個單獨的類?我應該將方法添加到繼承db.Model的類中,還是應該將這些類繼承爲新類?

例如,如果我想在存儲信息的帖子,我應該已經張貼延長db.Model,或者我應該已經POSTDATA延長db.Model和擴展後(甚至引用?)POSTDATA?

我認爲,區別在於繼承db.Model的類不會創建沒有所有必需屬性的實例。我希望看到的行爲不是保存到沒有必需屬性的數據存儲區。哪個更清潔?哪一個是首選?

回答

2

添加方法db.Model子類是完全沒有問題的做法。如果您有幾個模型類可以共享的常見功能,就像在標準繼承中一樣,讓您的實際模型子類本身是一個db.Model子類是唯一的要點。

我不確定您的建議方法如何幫助您「不保存到沒有必需屬性的數據存儲區」,除非您打算創建自己的數據模型,而這些數據模型可以從數據存儲區模型轉換到數據存儲區模型 - 這只是將會浪費大量時間(包括你的和處理器的)。數據存儲庫的工作方式,不可能創建一個模型,其中的值不會被驗證,我不確定爲什麼您想要。

2

提示:使用從數據存儲模型

我覺得他們是在最純粹的形式,你應該用你的模型分離的業務邏輯。

您可以使其他處理程序將它們用作顯式類型。 有些清潔劑不會繼承它們。想想數據連接。您可以在斷開連接或連接狀態下使用模型。

在紅寶石我會用混入或concerned_with圖案模型

在Python中我建議使用Django,所以你的觀點可能包含業務邏輯的大部分。 http://www.djangobook.com/en/1.0/chapter05/

嘗試使用mixins!

mixin類是一種使用類的繼承能力來組成一個類的方法,它們由較小的行爲組成。

https://docs.djangoproject.com/en/dev/ref/class-based-views/

0

另一種方法是使用組合(通常是繼承的更好的選擇)。例如

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操縱時,那麼你可以控制什麼樣的突變是可能的。然後,您可以根據需要注意使緩存條目無效。