2017-05-08 44 views
6

因此我有兩個應用程序在同一個項目中運行。無法從Django的其他應用程序導入模型

我的文件結構如下:

/project_codebase 
    /project 
     __init.py 
     settings.py 
     urls.py 
     wsgi.py 
     ...  
    /app1 
     ... 
    /app2 
     ... 
    manage.py 

所以,我對於一些奇怪的原因,有我的根目錄不同的名稱(即,它的代碼庫結束)。希望這不是問題。

在我settings.py,我有這樣的:

INSTALLED_APPS = [ 
    ... 

    'app1', 
    'app2', 
] 

好,所以在我models.py(從應用2),我可以很容易地從APP1導入模型與from app1.models import *,但是,當我在我的models.py(來自app1)中使用from app2.models import *時,我得到一個ImportError。

對此的任何解決方案?

+0

可能是由於循環依賴。 http://stackoverflow.com/questions/744373/circular-or-cyclic-imports-in-python – badiya

+3

那麼,你已經創建了一個循環導入依賴。爲什麼你需要將每個應用程序的模型導入到其他模型中? –

+0

你應該接受一個答案。 – dendragon

回答

11

這可能是由於循環導入問題。爲了避免這種情況,你應該動態加載模型:

對於最近的Django的版本(1.7+)使用application registry

from django.apps import apps 
MyModel1 = apps.get_model('app1', 'MyModel1') 

對於早期的Django版本(< 1.7)

from django.db.models.loading import get_model 
MyModel1 = get_model('app1', 'MyModel1') 

注1:如果你想要t o定義外鍵關係,有不需要單獨的導入語句。 Django的has you covered這個:

如果app1是已安裝的應用程序,你應該定義如下ForeignKey的關係:

# in app2.py 
class MyModel2(models.Model): 
    mymodel1 = models.ForeignKey('app1.MyModel1') 

注2:本get_model只有工作,如果app1是安裝的應用程序和MyModel1是您要從app1導入的模型。

注3:儘量避免通配符導入(from ... import *),作爲this is bad practice

1

您需要指定要導入的型號名稱,例如from app1.models import ModelName1, ModelName2

5

這絕對是一個循環進口。

但我認爲你需要的是使用模型作爲某種RetationFields(ForeignKeyManyToManyFieldOneToOneField)的參數。所以,你需要跳過進口和使用像這樣:

# app1/models.py 
class Model1(models.Model): 
    relation_field = models.ForeignKey('app2.Model2') 

docs:如果你需要創建一個尚未被定義的模型的關係

,你可以使用的名稱模型,而不是模型對象自身

要引用另一個應用程序定義的模型,你可以明確指定完整的應用程序標籤

模型

只需將str對象作爲關係字段的第一個參數,即<app_name>.<Model_name>即可。

注意:這是更好地避免模塊(from <module_name> import *)進口一切

3

如果要導入只有一些特定的模塊那麼就不要使用import *

加載所有庫需要更多時間,因此也會影響應用程序的速度。

如果你想用幾個模塊從你的第二個應用程序,然後只需添加模塊名稱,而不是整個圖書館是這樣的:

from app2.models import Module1, Module2 

,或者它可以是圓形的進口問題,因爲其他的澄清。

謝謝。

0

我一直用這個代碼和它的工作:)

from position_app.models import Member

相關問題