我有一些抽象的模型:
class MyModel(models.Model):
#some filelds...
class Meta:
abstract = True当我像这样导入这个模型时:from project.application.models import MyModel我导入了这个类:<class 'project.application.models.MyModel'>,但是当我像这样导入:from application.models import MyModel时,我导入了这个没有project前缀的类:<class 'application.models.MyModel'>
如果模型不是抽象的,那么它总是使用project前缀导入:<class 'project.application.models.MyModel'>
所以当我尝试使用issubclass函数时,它会导致奇怪的行为。
问题是为什么django以这种方式抽象模型,以及如何避免这种行为?
发布于 2012-08-17 22:01:38
解释
我不确定这是否与Django或抽象类有关,但与您的路径是如何构建的有关。
下面是一个例子:
dir0/
dir1/
__init__.py
dir2/
__init__.py containing class A现在假设dir0和dir1都在您的路径上,您将得到:
>>> from dir2 import B
>>> B
<class 'dir2.B'>
>>> from dir1.dir2 import B
>>> B
<class 'dir1.dir2.B'>解决方案
幸运的是,从django 1.4开始,您不再需要路径技巧,这种情况应该不会再出现。只有包含你的manage.py的目录,以及你的项目文件夹和应用文件夹应该在你的路径上。
你应该始终使用import myapp...或from myapp...,不要在你的导入中使用项目,这会使你的应用程序不可重用。
您可以查看the django documentation for 1.4,它将旧项目布局与新项目布局进行了比较。
https://stackoverflow.com/questions/11842011
复制相似问题