尝试从其他应用程序导入模型时出现 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.models
、app2.models
、django1.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)
我已经解决了几乎每个 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_APPSINSTALLED_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.models
、app2.models
、django1.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)