2016-09-30 67 views
1

我正在研究包含不同應用程序(產品,銷售,採購,會計,MRP等)的Django上的小型ERP項目。其中有一些具有依賴性(例如,銷售應用程序需要產品應用程序)。Django:擴展其他應用程序的模型

爲了模塊化和鬆耦合,我試圖保持應用程序儘可能獨立。但是,如果應用程序可以在其依賴關係的模型中擴展(添加新字段)表(例如,Sales會在產品範圍內的其中一個表中添加can_be_sold布爾值字段),那麼這將非常有用,如果安裝)。

這種方式當用戶在內部選擇安裝應用程序時,數據庫中所需的更改會使其正確地與依賴項集成。用戶只安裝他需要的應用程序,而不必在依賴關係中提供不必要的或無關的信息。

我想與依賴關係建立一對一的關係,但是這個解決方案並沒有說服我,因爲(a)爲一個或兩個額外的字段創建如此多的新表似乎並不是非常有效(b)使用表單和信號將是一件麻煩事(如果安裝了許多應用程序並且總體上減少了模塊化,則使代碼難以保存)。

繼承或抽象類似乎也不合適,因爲我沒有試圖爲子產品創建模型,而是增長或擴展表中的現有信息(條目)。

達到此目的的最佳方法是什麼?我應該考慮編寫自定義遷移操作嗎?否則,有更好的方法嗎?謝謝!

回答

1

我建議你創建一個數據庫tabel來保存所有可能的註冊模塊和類。 所以你可以在eval語句中使用它作爲變量python代碼。 ,如果你有預先定義的方法名稱,在這種方法下面我稱之爲common_method。

你不甚至需要有一個抽象類

my_evaluated_code = 'from '+mymodule_var_name + ' import ' + myclass_var_name +' as custommodule' 
eval(my_evaluated_code) 
custommodule.common_method() 
+0

謝謝,但如何將這個正好有助於對現有的應用程序表添加新的領域? – mtcg

+0

您可以根據生成的代碼預測繼承存在dinamicaly,存儲在數據庫中。所以你的代碼永遠不會破壞,如果你沒有在那裏的文件 –