我有一个目录结构如下的项目:
mywebsite/
manage.py
__init__.py
myapp/
models/
__init__.py
base.py
myapp / models / base.py包含:
class X(object):
pass
myapp / models / __ init__.py包含:
from base import X
现在,如果我执行manage.py shell,我可以进行以下会话:
> import mywebsite.myapp.models
> import myapp.models
> mywebsite.myapp.models.X == myapp.models.X
False
但是,如果我将myapp / models / __ init__.py更改为:
from myapp.models.base import X
然后我按预期得到了真实。
我认为在使用manage.py shell时,我遗漏了一些关于导入如何工作或Django如何改变路径的内容。
任何人都能解释一下吗?
答案 0 :(得分:4)
当您打开Django shell时,它会将项目的路径添加到sys.path
。你可以通过在Django shell和普通的python shell上运行import sys; print sys.path
并比较输出来看到这一点。您将注意到Django shell的输出包含mywebsite
目录的路径作为列表的第一项。
基本上,这意味着两个导入会创建两个不同的模块对象,因为它们来自different points in the search path。比较检查返回False,因为模块对象具有不同的id(内存地址)
# These two values will be different
id(mywebsite.myapp.models)
id(myapp.models)