这一直困扰着我,我从来没有真正想出过这样做的首选方法。
从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
但是,那可能只是我。
哪一个更好,为什么?
答案 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对这些概念进行了很好的基本讨论。