2013-11-28 42 views
0

在一個應用程序中的models.py變大後,我試着將一些類移動到子包中。Django:將模型重構爲子模塊

舊的結構是這樣的:

# File: assets/models.py 
class Asset(...): 
    # lots of irrelevant code 

# File: widgets/models.py 
from assets.models import Asset 
class Video(...): 
    asset = models.ForeignKey(Asset) 

這個工作沒有問題,所以我不打算進入關於結構的進一步細節。

我現在試着做的是將Asset類移入子模塊。結構現在如下:

# File: assets/models/__init__.py (of course I deleted the old models.py) 
from .assets import Asset 

# File: assets/models/assets.py 
class Asset(...): 
    # lots of irrelevant code 

# File: widgets/models.py 
from assets.models.assets import Asset 
class Video(...): 
    asset = models.ForeignKey(Asset) 

不知何故,這是行不通的,我不知道究竟是什麼導致了麻煩。我得到的錯誤是這樣的:

widgets.video:「資產」與模型的關係,這要麼不安裝或 是抽象

回答

4

Django似乎無法可靠地檢測到模型屬於哪個應用程序,如果它位於嵌套子模塊中(即不直接在APPNAME.models中)。

這是一個公知的問題,並且可以通過添加以下行(在此情況下到Asset類),從而明確地對應的應用程序模型定義來解決屬於:

class Asset(models.Model): 
    ... 
    class Meta: 
     app_label = 'assets' 
    ... 

參考文獻:

0

您應該models爲進口前:

from assets.models import Asset 

這可以讓你始終從models導入但models目錄內單獨組織模型。這也意味着,在概念上,Asset仍然在models中,因爲您的ForeignKey指的是assets.models.Asset對象,而不是assets.models.assets.Asset

+0

謝謝!我剛剛嘗試過,不幸的是,Django仍然給出了同樣的錯誤。 –

+0

@DaveVogt:你可能會發布堆棧跟蹤? Django在哪裏提出這個錯誤? –