为什么我不能从Django项目中的另一个应用程序引用此类?

时间:2019-03-26 18:53:23

标签: python django python-3.x import

我正在使用Django和Python 3.7。我的项目中有两个应用程序-common和mainsite。通常,我的应用程序根目录(在models.py旁边)有一个文件“ model_utils.py”。它包含此代码

class RawCol(Expression):

    def __init__(self, model, field_name):
        field = model._meta.get_field(field_name)
        self.table = model._meta.db_table
        self.column = field.column
        super().__init__(output_field=CharField())

    def as_sql(self, compiler, connection):
        sql = f'"{self.table}"."{self.column}"'
        return sql, []

如何从其他应用程序“ mainsite”中引用此类?我将其放在主站点中一个文件的顶部。

from common import RawCol

但是当我运行一些测试时,出现此错误...

ImportError: cannot import name 'RawCol' from 'common' (/Users/davea/Documents/workspace/mainsite_project/common/__init__.py)

编辑:顶级目录中的项目结构看起来像...

+ common
+ mainsite
+ mainsite_project
+ manage.py
+ templates
+ venv

1 个答案:

答案 0 :(得分:3)

尝试from common.model_utils import RawCol

代替from common import RawCol

您始终需要指定要导入的确切.py文件(不带.py结尾)。

如果仍然无法使用,则可能是循环导入问题。

如果您尝试将mainsite.model中的某些内容导入common.model_utils中,或者相反,则将创建一个不可能的导入循环。

您可以通过创建单独的文件(例如common / dependent_model.py)并仅在其中放置RawCol()类而无需从主站点导入来解决此问题。这样,两个文件就不会互相导入(这是行不通的)。