我几乎经历了每个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并将其安装以将其转换为软件包(即使没有教程告诉我这样做),但仍然有问题。
非常感谢您的帮助:)
答案 0 :(得分:3)
结构为
- 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)