Python Django 3名称错误:名称';型号名称';没有定义

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__.

我知道这个问题已经提出来了,但很多答案都提到了Django和Python的旧版本。我正在运行Django3和Python 3。 此外,在我们的项目中,我们决定将每个模型分别放在一个“models”文件夹下的自己的文件中。请参见下面我们的树结构:

├── 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,请你把你的评论作为一个答案,这样我就可以投票了,把它标记为解决方案。再次感谢您的时间和帮助!