Django:子目录相对导入中的应用

时间:2018-11-11 12:13:18

标签: python django

我正在按照this cookiecutter template的结构设置Django项目,但是我的应用程序中存在明确的相对导入问题。

我正在尝试使用from .model import ModelA导入我的模型,但是我从Django中收到此错误:

  

RuntimeError:模型类core.models.ModelA没有声明显式的app_label,也不在INSTALLED_APPS中的应用程序中。

我的项目的结构如下:

my_project
  - config
    - __init__.py
    - settings.py
    - urls.py
  - my_project
    - __init__.py
    - core # this is an app
      - __init__.py
      - models.py
      # remaining app files
  manage.py

我当然可以将我的应用放入INSTALLED_APPS:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'my_projects.core.apps.CoreConfig', # my app
]

然后将CoreConfig设置为:

class CoreConfig(AppConfig):
    name = 'my_project.core'

使用显式相对导入时,感觉django没有加载AppConfig。

如果我将导入更改为绝对路径from my_project.core.models import ModelA

,一切都将正常运行

我想念什么?

编辑1:

也许值得一提的是,我已经在manage.py中添加了几行(如cookiecutter模板一样),用于将my_project目录添加到sys.path中。

from django.conf import settings
sys.path.append(os.path.join(settings.ROOT_DIR, 'my_project'))

1 个答案:

答案 0 :(得分:0)

config.urls中附加网址时,应使用my_projects.core.urls而不是core.urls。例如:

urlpatterns = [
    ...

    # Your stuff: custom urls includes go here
    path("my_projects/", include("my_projects.core.urls", namespace="my_projects")),
] + static(
    settings.MEDIA_URL, document_root=settings.MEDIA_ROOT
)