2009-10-24 135 views
2

我在我的應用程序中有一定的類結構,目前利用django進行演示。我根本沒有使用模型層, - 數據庫交互例程是手寫的。將複雜的python對象映射到Django模型

但是,我正在考慮實際使用django以充分發揮其潛力並實際使用數據庫抽象層的可能性。問題是如何最好地將我現有的類結構與模型層結合起來。

一個例子類:這裏

class UpperClass(base): 
    def __init__(self, attr1, attr2): 
     self.attr1 = attr1 
     self.attr2 = attr2 
     # attr1 and attr2 are actually instances of, say, 
     # CustomType1 and CustomType2 

母豬我怎麼去這個映射到一個Django模型:

class UpperClass(models.Model): 
    attr1 = CustomType1Field(...) 
    attr2 = CustomType2Field(...) 

夠簡單 - 所有的序列化和驗證的東西已經被寫入,所以想出CustomType1和CustomType2的自定義字段類並不難。

真正的問題是,我在哪裏放置實際UpperClass的自定義(非數據庫相關)行爲。根據我的理解,模型可以用於「將數據從數據庫中取出」,但是行爲在哪裏呢?我是否將非數據庫相關的方法嵌入到UpperClass的Model實例中?真的,我在這裏不知所措。希望這至少對你有部分意義。

回答

2

它在某種程度上取決於您想要編碼的具體行爲。在大多數情況下,您應該嘗試將每個對象行爲放入模型類中。畢竟這是一個普通的Python類,所以你可以給它任何你想要的方法。當然,你需要考慮到持久性。通過避免超出架構中指定的成員數據。

+0

突然間,這對我來說非常有意義。由於模型字段(models.Field的子類)映射回Python類型/類(通過to_python()),所以UpperClass的類實例如何初始化並不重要 - 無論是通過從我的代碼直接調用__init__ a = UpperClass(attr1 = foo,attr2 = bar))或通過ORM(a = Upperclass.objects.get(...))。不管怎樣,實例名稱空間都會被attr1和attr2填充爲正確的類型。我對你有正確的理解嗎? – shylent 2009-10-24 19:36:43

+0

是的:UpperClass的實例是常規的Python對象,常規屬性attr1和attr2(從數據庫讀出)。 – 2009-10-24 19:45:33

+0

非常感謝您的幫助。 – shylent 2009-10-24 19:48:01

0

這在很大程度上是一個哲學問題:MVC以及您如何選擇實現它。可以說這裏沒有正確的方法,但假設你希望模型對象都以某種方式行爲,而不管與它們交互的視圖如何,將這種行爲附加到模型是有意義的。如果行爲僅針對特定視圖,並且還有許多其他視圖與模型進行交互,那麼將其附加到視圖可能更有意義。