2010-01-06 41 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对这些概念有一个很好的基本讨论。

相关问题