2010-01-06 38 views
0

這一直困擾着我,我從來沒有真正拿出我自己喜歡的方式來做到這一點。在django項目中導入模塊的建議方式是什麼

當從一個Django項目自己的應用程序一個進口的東西,你導入具有:

from myproject.mymodule.model import SomeModel 
from myproject.anotherone.model import AnotherModel 

,或者你是做:

from mymodule.model imoprt SomeModel 
from anotherone.model import AnotherModel 

當然,無論是將工作只要您在部署時正確設置PYTHONPATH即可。即使是在給定項目中這兩者的組合也是可行的。

我的問題與第二種形式是當你有一個utils.py或類似的坐在你的項目。

# This feels wrong 
import utils 

但是,那可能就是我。

哪一個更好?爲什麼?

回答

5

我會建議使用第二種方式:

from mymodule.model import SomeModel 
from anotherone.model import AnotherModel 

在Django中,建議編寫可重複使用的應用程序,你可以在多個項目中部署。指定項目名稱會阻礙這種可能性。如果您只是更改頂部項目文件夾的名稱,它甚至會變得複雜!

這是大多數django應用程序使用的傳統(例如pinax,django contrib等)。

欲瞭解更多詳情,你應該聽DjangoCon 2008: Reusable Apps

1

我更喜歡儘可能使用絕對導入。第一個原因是相對導入在Python 3中正在出現,所以最好不要陷入這種習慣。 (根據你說的這個問題的方式,我假設你將應用程序包放入你的項目包中。)第二個原因是它使得你導入的內容更明確。

雖然我的絕對最好的做法是不把我的應用程序包放在項目包中。這樣,移動應用程序變得更加容易,而且當您在包內使用絕對導入時,如果稍後在不同名稱的項目中使用相同的應用程序,則不必重寫所有導入以反映不同的項目名稱。

0

你是如何正常打包模塊的?如果你將它們全部打包在「myproject」模塊下,你應該繼續這樣做。如果你不是,那麼沒有理由開始。我沒有看到在Django項目中與這個問題有什麼關係 - 如果你不重複使用代碼,爲什麼還要分離你的包?

但實際上,更重要的一點是,您並未考慮如何打包和分發更廣義的庫。即使它們只是一些方便的實用程序集合,而且您不打算分享它們,您應該考慮命名空間問題。 The Python Tutorial對這些概念有一個很好的基本討論。

相關問題