2009-12-10 188 views
20

這是一個非常簡單的Django模式問題。我的經理代碼通常位於models.py中,但models.py真的很龐大時會發生什麼?是否有其他可供選擇的模式讓您的經理代碼可以存儲在models.py中以實現可維護性並避免循環導入?django經理代碼應該在哪裏?

可能會問一個問題,爲什麼models.py是如此之大,但讓我們假設它的大小和效用的寬度是合理的。

回答

21

我更願意將models.py中的模型和managers.py中的管理器(forms.py中的表單)保存在同一個應用中。對於更通用的管理人員,如果他們可以重新用於其他應用程序,我更願意將其保留在core.managers中。在一些帶有models/modelname.py的較大應用程序中,這些應用程序將包含一個經理和模型代碼,這看起來並不糟糕。

+1

那麼你如何幹淨地處理models.py需要導入managers.py,反之亦然? – Jeff 2009-12-10 19:50:24

+24

managers.py不應該需要導入模型 - 所涉及的模型將始終可用作管理器上的self.model。 – jacobian 2009-12-10 20:23:32

+5

這太棒了......除非你的經理的QuerySet需要引用另一個模型 - 那麼你不能導入它,並且必須把它放在models.py中(例如,如果你排除了另一個模型中存在的項目等)。 – 2011-02-25 16:59:58

3

我在構建Django應用程序時所做的工作是創建一個[modelname] .py文件,其中只包含特定的模型代碼,管理器代碼以及有時表單代碼,然後使用__init__.py文件導入模型目錄中的所有文件。這幫助我至少保持它的可管理性。

+0

如果我要這樣做,我會把所有這些文件放在'models'文件夾中。它會保持應用程序根清潔並更好地組織進口。 – jangeador 2016-08-03 15:43:43

6

我總是把我的地方放在managers.py中。如果您有循環導入問題,請記住a)您可以在self.model中引用經理的模型類,並且b)您可以在函數內部執行導入。

+0

+1提醒我們你可以在一個函數裏面導入。在我的情況下,我必須爲我的經理使用外部模型,並且在方法內部添加了'apps.get_model(app_label ='app_name',model_name ='model_name')'' – jangeador 2016-08-03 15:41:35

7

最好的辦法就是使用django模塊來創建一個名爲models的文件夾。將舊的models.py移動到該模型文件夾中,並將其重命名爲__init__.py。這將允許您將每個模型分隔到此模型文件夾內的更具體的文件中。

然後,您只需將每個模型導入__init__.py的名稱空間。

所以,舉例來說,你可能想將其分爲:

yourapp/ 
    models/ 
     __init__.py # This file should import anything from your other files in this directory 
     basic.py # Just an example name 
     morespecificmodels.py # Just an example name 
     managers.py # Might want to separate your manager into this 

那麼你__init__.py可以只是:

from basic import * # You should replace * with each models name, most likely. 
from managers import YourManager # Whatever your manager is called. 

這是當我的模型文件拿到我用的是結構巨大的,但我嘗試儘可能多地將事物分成更多可插拔的應用程序 - 所以這很少被我使用。

希望這會有所幫助。

相關問題