2013-04-29 31 views
2

我已經安裝在我的Django項目兩個應用程序...與類依賴性處理在Python

Contacts Package 
    Models.py 
    - class Contact 

Homes Package 
Models.py 
    - class House 

House有一個名爲get_contact模型方法,這個方法我導入聯繫人和過濾等(並不重要)

我的問題:房子現在依賴於聯繫人,這意味着我不能再安裝房子的應用程序沒有聯繫人的應用程序了。儘管這個房子應該能夠沒有聯繫人而存在。在Python中,(在框架Django的上下文中)Python人如何處理這個問題?

有沒有更好的方法?

回答

3

如果House使用Contacts包僅限於單一的方法,那麼你把進口的方法內捕捉到了異常:

def foo(self): 
    try: 
     from Contacts.Models import Contact 
    except ImportError: 
     return 
    ... use Contact here 

或者你可以把進口在頂部該模塊,但它設置爲無的情況下是不可用:

try: 
    from Contacts.Models import Contact 
except ImportError: 
    Contact = None 


... 
if Contact is not None: 
    ... use Contact ... 

如果你想去一個更純粹的面向對象的路線,那麼你可以使用Zope3適配器,但是這意味着你已經換依賴在一個包裹上依賴一組其他人。對於您所描述的問題,這可能會過度,但如果您想調查此解決方案,請參見this blog post

我認爲如果你嘗試這個,你會遇到的真正問題是你必須定義一個接口,例如你可以爲你的House類獲取的接口,如IContactProvider。該接口必須在某個地方居住,如果某處是聯繫人包,則最終還是需要安裝該包。如果你的需求是針對某種通用的IContactProvider和幾個特定的​​實現,那麼這可能是處理這個問題的好方法。

+0

這是很好的OOP壽? – Prometheus 2013-04-29 09:19:22

+1

@Spike這不是一個真正的問題。關於Duncan的回答,我通常更喜歡第二種解決方案,因爲我相信將所有進口都放在模塊的頂部會更好。 – Bakuriu 2013-04-29 10:41:10

+0

@Spike,我添加了一個面向對象的解決方案,但是我認爲對於你描述的情況來說這太過分了。 – Duncan 2013-04-29 11:18:41

1

Django作爲信號和ProxyModels(當沒有更好的解決方案時,Python有monkeypatching)。我通常做的事情是保持應用程序的解耦(當然,這很有意義),就是將一個「主」django應用程序用作特定於項目的集成層。在這種情況下 - 假設HouseContact(即ForeignKey)沒有「硬連線」依賴性 - 我將爲House定義一個ProxyModel,我將添加get_contact方法。

1

在Django中,您可以在運行時通過名稱動態獲取模型,這是避免循環導入的好選擇。該功能是django.db.models.get_model()具有以下特徵:

def get_model(self, app_label, model_name, seed_cache=True, only_installed=True) 

所以你在House模型代碼應該看起來像

from django.db.models import get_model 
Contact = get_model('contacts', 'Contact')