尝试从其他应用程序导入模型时,Django导入错误

时间:2020-06-25 11:08:14

标签: python django python-import importerror

我几乎经历了每个Python / Django导入StackOverflow问题,但仍然无法解决此问题。在Django中,我试图创建一个新模型,该模型在另一个应用程序中具有模型的外键。我似乎无法导入。

我正在Windows 10上运行Python 3.8,并且在干净的虚拟环境中运行

步骤:

> pip install django
> django-admin startproject django1
> cd django1
> python manage.py startapp app1
> python manage.py startapp app2

将两个应用都添加到django1 / settings.py中的INSTALLED_APPS中:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1',
    'app2'
]

在app1 / models.py中创建模型:

from django.db import models


class App1Model1(models.Model):
    val1 = models.BooleanField()
    val2 = models.BooleanField()

在app2 / models.py中创建模型:

from django.db import models
from ..app1.models import App1Model1


class App2Model1(models.Model):
    ref1 = models.ForeignKey(App1Model1, on_delete=model.CASCASE)

Pycharm可以相对导入,但是一旦运行manage.py我就会得到:

django1>python manage.py runserver
...
File "C:\DEV\sherpytest\django1\app2\models.py", line 2, in <module>
from ..app1.models import App1Model1
ValueError: attempted relative import beyond top-level package

如果我将app2 \ models.py中的导入更改为此:

from django.db import models
from django1.app1.models import App1Model1


class App2Model1(models.Model):
    ref1 = models.ForeignKey(App1Model1, on_delete=model.CASCASE)

我得到:

django1>python manage.py runserver
...
File "C:\DEV\sherpytest\django1\app2\models.py", line 2, in <module>
from django1.app1.models import App1Model1
ModuleNotFoundError: No module named 'django1.app1'

我尝试在django1中创建setup.py并将其安装以将其转换为软件包(即使没有教程告诉我这样做),但仍然有问题。

enter image description here

非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:3)

结构为

- project root
  - manage.py
  - django1 (project)
  - app1 (app)
  - app2 (app)

您始终使用app1.modelsapp2.modelsdjango1.somethingsomething导入内容,而永远不会使用相对导入达到manage.py往往会达到的“根”级别的内容生活。 (自然,如果您的应用程序中包含软件包,则可以在其中自由使用相对导入,但不能跨应用程序使用。)

也就是说,

from django.db import models
from app1.models import App1Model1

class App2Model1(models.Model):
    ref1 = models.ForeignKey(App1Model1, on_delete=models.CASCADE)

您还可以通过字符串引用其他应用程序的模型,以避免某些循环导入问题:

from django.db import models

class App2Model1(models.Model):
    ref1 = models.ForeignKey("app1.App1Model1", on_delete=models.CASCADE)