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

Django import error when trying to import a model from a different app

我已经解决了几乎每个 Python/Django import Whosebug 问题,但我仍然无法解决这个问题。在 Django 中,我正在尝试创建一个新模型,该模型在不同的应用程序中具有模型的外键。我似乎无法导入这个。

我 运行宁 Python 3.8 Windows 10,运行宁在干净的虚拟环境中

步数:

> 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 并安装它以将其变成一个包(即使没有教程告诉我这样做)但仍然有问题。

非常感谢任何帮助:)

当结构为

- 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)