2012-10-04 75 views
0

我有兩個Django項目,我使用了很多通用模型。自定義用戶類,算法類,產品類。這兩個項目與電子商務有關,它們都運行在不同的機器上,並且服務於完全不同的目的。在多個項目中包含常見的Django項目

但是,考慮到他們在「常見」中有這些模型,我想知道是否值得創建第三個通用項目作爲基礎模型的「基礎」,然後這兩個項目項目會從這個基礎項目導入通用模型。

這也將有所幫助,因爲我們可以將這兩個不同的客戶和產品數據庫從這兩個電子商務網站加入到這個大型通用數據庫中。

我的問題是: 1)有沒有人有任何經驗可能的開銷或可以實際估計它?加入Django項目的共同部分將是必要的,但我估計在導入第三個項目(可能是實時的)時會有很多開銷。

2)在第三個項目中導入最好的方法是什麼?我能想到的多種方式:

  • 創建打包,安裝Python模塊,如互聯網(setuptools的,LXML,tastypie)和導入該模塊到兩個Django的項目,在現有的;
  • 讓項目坐在一臺機器上的一個目錄中,並在Python文件中實時導入該路徑(之前做過,可以工作但似乎有一些開銷);

編輯:我們的常見模型/功能,另外,包含貿易分泌和可獲得的內容,因此公衆分佈是不可能的。我猜測路線是創建類似包的東西,但不是公開發布的,只分發和安裝在2臺特定的機器上。

有人可以對此提供一些反饋嗎?

謝謝

回答

1

我會分離出常見的機型,等...到它自己的Python包。然後每個項目都會安裝這個軟件包,或者只是在系統級安裝軟件包,他們都可以使用它。如果你正確地處理這個問題,你不應該改變你的進口,你可以通過推送一個新的蛋到服務器並通過easy_installpip安裝來輕鬆更新包裝。

這是我現在有我的項目設置的方式。常見的非業務邏輯被分離到他們自己的項目中,我從中創建一個包,然後像其他任何python庫一樣安裝和使用。

這裏額外工作的一小部分可以爲您節省大量時間,並允許在各種項目之間透明更新您的通用代碼。

+0

這似乎是一個很好的解決方案。但是,我們在我們的共同材料中使用了商業祕密材料,因此無法公開訪問。我們是否可以僅爲所選機器創建和分配創建的模塊? –

+1

是的,你可以在本地設置一個私人回購站,或者你可以從egg文件本身安裝,你不需要上傳到pypi。 – sean

0

將您的模型組織成單個項目中的邏輯應用程序。

例如一個項目有4個應用程序:

myproject/ 
    blog/ 
    contact/ 
    project1specific/ 
    project2specific/ 

使用站點框架: https://docs.djangoproject.com/en/dev/ref/contrib/sites/

有2個settings.py文件(settings_p1.py,settings_p2.py)

在每個設置文件中,將SITE_ID設置爲每個項目的不同值。

SITE_ID = 1 (or 2 for the second project) 

不要忘了在您的網站表中實際創建第二個網站記錄!

在每個settings.py中的INSTALLED_APPS中只包含要用於此特定項目的應用程序。

也許設置2個不同的模板目錄,STATIC_ROOT(MEDIA_ROOT可能會保持不變),並在2個項目的設置文件中URL文件。

此時,您可以爲每個項目settings.py使用不同的數據庫設置,也可以將Site FK添加到模型中,並使AdminForms查詢集僅反映當前的站點記錄。

讓我知道你是否需要任何細節,但這是我將如何完成你在做什麼。

+0

感謝您提供深入的解決方案。問題是,這兩個項目都很龐大。每個支持數千個活躍用戶和類似的數千個產品。因此,每個項目已經有大約5-10個子模塊。我認爲將兩個項目與其子模塊合併成一個大項目會倒退,因爲不是封裝功能,而是以另一種方式進行封裝? –

+0

是的,我的解決方案是我們爲移動網站做的,當它與桌面版本鬆散耦合時,我們的解決方案卻有足夠的差異,需要2套應用程序/模板/網址。 –

0

如果您打算在可預見的未來並行支持這些應用程序,這是絕對值得的。除了對一件事做出改變,然後在另一個地方几乎逐字地重複它,沒有什麼比這更令人沮喪的了,尤其是如果奇怪的特定項目的錯誤開始出現,因爲這兩個錯誤仍然微妙地不同。

實現此類共享的一種方法可能是git submodules或felixge的Git Fake Submodules

相關問題