Python Django 3名称错误:名称';型号名称';没有定义
我知道这个问题已经提出来了,但很多答案都提到了Django和Python的旧版本。我正在运行Django3和Python 3。 此外,在我们的项目中,我们决定将每个模型分别放在一个“models”文件夹下的自己的文件中。请参见下面我们的树结构:Python Django 3名称错误:名称';型号名称';没有定义,python,django,Python,Django,我知道这个问题已经提出来了,但很多答案都提到了Django和Python的旧版本。我正在运行Django3和Python 3。 此外,在我们的项目中,我们决定将每个模型分别放在一个“models”文件夹下的自己的文件中。请参见下面我们的树结构: ├── db.sqlite3 ├── manage.py ├── poi │ ├── admin.py │ ├── apps.py │ ├── CHANGELOG.md │ ├── fabfile.py │ ├── __init__.
├── db.sqlite3
├── manage.py
├── poi
│ ├── admin.py
│ ├── apps.py
│ ├── CHANGELOG.md
│ ├── fabfile.py
│ ├── __init__.py
│ ├── LICENSE
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── 0002_auto_20210104_1048.py
│ │ ├── __init__.py
│ │ └── __pycache__
│ │ ├── 0001_initial.cpython-38.pyc
│ │ ├── 0002_auto_20210104_1048.cpython-38.pyc
│ │ └── __init__.cpython-38.pyc
│ ├── models
│ │ ├── __init__.py
│ │ ├── layer.py
│ │ ├── poi.py
│ │ ├── __pycache__
│ │ │ ├── __init__.cpython-38.pyc
│ │ │ ├── layer.cpython-38.pyc
│ │ │ ├── poi.cpython-38.pyc
│ │ │ └── tag.cpython-38.pyc
│ │ └── tag.py
│ ├── models.py
在我们的型号/init.py中,我们有:
from .poi import Poi
from .tag import Tag
from .layer import Layer
from django.db import models
from .tag import Tag
from .layer import Layer
class Poi(models.Model):
...
...
tags = models.ManyToManyField('Tag', through='Layer')
def __str__(self):
return self.name
from django.db import models
import poi.models.poi
import poi.models.layer
class Tag(models.Model):
name = models.CharField(max_length=100)
pois = models.ManyToManyField('Poi', through='Layer')
def __str__(self):
return self.name
from django.db import models
import poi.models.poi
import poi.models.tag
class Layer(models.Model):
poi = models.ForeignKey(Poi, on_delete=models.CASCADE)
tag = models.ForeignKey(Tag, on_delete=models.CASCADE)
在我们的模型/poi/poi.py中,我们有:
from .poi import Poi
from .tag import Tag
from .layer import Layer
from django.db import models
from .tag import Tag
from .layer import Layer
class Poi(models.Model):
...
...
tags = models.ManyToManyField('Tag', through='Layer')
def __str__(self):
return self.name
from django.db import models
import poi.models.poi
import poi.models.layer
class Tag(models.Model):
name = models.CharField(max_length=100)
pois = models.ManyToManyField('Poi', through='Layer')
def __str__(self):
return self.name
from django.db import models
import poi.models.poi
import poi.models.tag
class Layer(models.Model):
poi = models.ForeignKey(Poi, on_delete=models.CASCADE)
tag = models.ForeignKey(Tag, on_delete=models.CASCADE)
在我们的模型/poi/tag.py中,我们有:
from .poi import Poi
from .tag import Tag
from .layer import Layer
from django.db import models
from .tag import Tag
from .layer import Layer
class Poi(models.Model):
...
...
tags = models.ManyToManyField('Tag', through='Layer')
def __str__(self):
return self.name
from django.db import models
import poi.models.poi
import poi.models.layer
class Tag(models.Model):
name = models.CharField(max_length=100)
pois = models.ManyToManyField('Poi', through='Layer')
def __str__(self):
return self.name
from django.db import models
import poi.models.poi
import poi.models.tag
class Layer(models.Model):
poi = models.ForeignKey(Poi, on_delete=models.CASCADE)
tag = models.ForeignKey(Tag, on_delete=models.CASCADE)
在我们的模型/poi/layer.py中,我们有:
from .poi import Poi
from .tag import Tag
from .layer import Layer
from django.db import models
from .tag import Tag
from .layer import Layer
class Poi(models.Model):
...
...
tags = models.ManyToManyField('Tag', through='Layer')
def __str__(self):
return self.name
from django.db import models
import poi.models.poi
import poi.models.layer
class Tag(models.Model):
name = models.CharField(max_length=100)
pois = models.ManyToManyField('Poi', through='Layer')
def __str__(self):
return self.name
from django.db import models
import poi.models.poi
import poi.models.tag
class Layer(models.Model):
poi = models.ForeignKey(Poi, on_delete=models.CASCADE)
tag = models.ForeignKey(Tag, on_delete=models.CASCADE)
运行python3 manage.py makemigrations时会出现错误。
错误:
我们在layer.py中尝试了其他导入方式,例如:
from .poi import Poi
from .tag import Tag
但这给了我们以下错误:
File "/media/elena/DATA2/Python-projects/osm-pois/osm-pois/upoi/poi/models/layer.py", line 2, in <module>
from .poi import Poi
ImportError: cannot import name 'Poi' from partially initialized module 'poi.models.poi' (most likely due to a circular import) (/media/elena/DATA2/Python-projects/osm-pois/osm-pois/upoi/poi/models/poi.py)
File”/media/elena/DATA2/Python projects/osm pois/osm pois/upoi/poi/models/layer.py“,第2行,在
from.poi导入poi
ImportError:无法从部分初始化的模块“Poi.models.Poi”导入名称“Poi”(很可能是由于循环导入)(/media/elena/DATA2/Python projects/osm pois/upoi/Poi/models/Poi.py)
你知道怎么解决这个问题吗?谢谢 我将@TonySuffolk66通过一条评论给出的建议作为一个答案,因为它工作得非常好。再次感谢
由于您的模型是在不同的文件中定义的,请尝试这样做:poi=models.ForeignKey('poi',on_delete=models.CASCADE),它使用字符串作为模型名称,而不是引用名称。由于Django初始化的方式,您无法“轻松”导入其他类似的模型
由于您的模型是在不同的文件中定义的,请尝试这样做:
poi=models.ForeignKey('poi',on_delete=models.CASCADE)
,即使用字符串作为模型名称,而不是引用名称。由于Django初始化每个应用程序的方式,您无法“轻松”导入其他类似的模型。@TonySuffolk66,这很有效!非常感谢您的解答和解释,Tony!:-)@TonySuffolk66,请你把你的评论作为一个答案,这样我就可以投票了,把它标记为解决方案。再次感谢您的时间和帮助!