在django项目中导入模块的建议方法是什么?

时间:2010-01-06 03:21:12

标签: python 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

但是,那可能只是我。

哪一个更好,为什么?

3 个答案:

答案 0 :(得分:5)

我建议使用第二种选择:

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

在Django中,建议编写可重用的应用程序,您可以在多个项目中进行部署。指定项目名称会妨碍这种可能性。它甚至会使您只是更改顶部项目文件夹的名称的情况变得复杂!

这是大多数django应用程序使用的传统(例如pinax,django contrib等)。

有关详情,请收听DjangoCon 2008: Reusable Apps

答案 1 :(得分:1)

我更愿意尽可能使用绝对导入。第一个原因是相对进口已经在Python 3中出现了,所以最好不要养成这种习惯。 (根据你提出问题的方式,我假设您将应用程序包放在项目包中。)第二个原因是它使您导入的内容的意图更加明确。

虽然我的绝对最佳做法是不将我的应用程序包放在项目包中。这样,移动应用程序就更容易了,当你在包中使用绝对导入时,如果你稍后在一个命名不同的项目中使用同一个应用程序,你将不必重写所有导入以反映不同的项目名。

答案 2 :(得分:0)

您是如何正常包装模块的?如果您将它们全部打包在“myproject”模块下,那么您应该继续这样做。如果你不是,那就没有理由开始了。我没有看到在Django项目中与问题有任何关系 - 如果你不重用代码,为什么还要分开你的软件包呢?

但实际上,更重要的是你没有考虑如何在更广泛的意义上打包和分发你的库。即使它们只是一个方便的实用程序例程的集合,并且您不打算共享它们,您应该考虑命名空间问题。 The Python Tutorial对这些概念进行了很好的基本讨论。