2011-02-23 66 views
0

当我尝试导入内部应用程序的东西:Django的进口问题

from app_name.models import something 

我已经导入错误, 我必须这样做:

from models import something 

发生此问题,在许多应用程序只在一个项目。我应该改变什么?

+1

我想你的应用程序不在sys.path中,或者'__init __。py'在某处丢失。 – Ski 2011-02-23 10:45:25

回答

1

这是不是什么@Skirmantas建议,即app_name不上PYTHONPATH,或者你有一个包冲突,其中一些其他app_name是您app_namePYTHONPATH前面。

我的预感是它可能是后者,你有一个应用程序与你使用的其他第三方应用程序具有相同的包名称;我在我的PYTHONPATH上曾经有两个顶级registration包。

如果你把我的失败与registration应用为例,你通常会打包项目是这样的:

myproject/ 
    myproject/ 
     registration/ 
      __init__.py 
      models.py 
     __init__.py 
     settings.py 
     urls.py 
    setup.py 

这是所有应用都应该打包一个community guideline是“插头和玩“兼容。他们应该是一个顶级的软件包,应该能够通过@Yuji建议的绝对路径来引用内部资源。如果您喜欢将您的应用程序与您的项目一起发货和打包,那意味着除了/myproject之外,/myproject/myproject也可以在PYTHONPATH之上。这甚至是enforced in some cases

正如我所说,这只是一个预感,你有冲突包名称。如果是这样的话,那么在这篇冗长的文章之后,你应该明白,你唯一的选择是将你的软件包重新命名为更独特的东西,但我绝不会立即将它直接泄露给某人。这是由于可悲的事实,我从来没有找到一个更合适的名称来代替registration

+0

问题已解决。我在我的应用程序文件中使用了与应用程序相同的名称。所以python试图从这个文件中导入表格,但不是从应用程序导入。 – szaman 2011-03-02 10:43:40

0

对不起,但你为什么要改变它? 这种方式更加干燥 - 你不会一遍又一遍重复app_name - 如果你想在将来重命名它 - 会更容易。

编辑:我的问题是回答下面,我显然不知道你应该总是导入使用完整路径的事实。

至于直接回答,我有2个猜测(没有足够的信息来完整地回答):

  1. 也许应用程序不把自己看作一个模块,当你从内
  2. 你导入缺少一些其他导入,一般到您的应用程序。

对不起,我不能更精确。

+0

http://www.python.org/dev/peps/pep-0008/对于包内导入的相对导入非常不鼓励。 始终对所有导入使用绝对包路径。 即使现在PEP 328 [7]已经在Python 2中完全实现了。5, 其明显的相对进口风格被积极劝阻; 绝对导入更便携,通常更具可读性。 – 2011-02-23 13:29:28