0

我有一些抽象模型:

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 抽象模型以及如何避免这种行为?

4

1 回答 1

0

说明

我不确定这与 Django 或抽象类有关,但与路径的构建方式有关。

举个例子:

dir0/
    dir1/
        __init__.py 
        dir2/
            __init__.py containing class A

现在假设两者dir0dir1在你的路上,你会得到:

>>> 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...or from myapp...,不要在导入中使用该项目,这会使您的应用程序不可重用。

您可以查看1.4 的 django 文档,该文档将旧项目布局与新项目布局进行了比较。

于 2012-08-17T14:01:38.010 回答