私はこの質問が出てきたことを知っていますが、多くの回答は古いバージョンのDjangoとPythonに言及しています。私はDjango3とPython3を実行しています。プロジェクトの他に、各モデルを「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
私たちのmodels / poi / poi.pyには、次のものがあります。
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
私たちのmodels / poi / tag.pyには、次のものがあります。
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
私たちのmodels / poi / layer.pyには、次のものがあります。
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.pymakemigrationsを実行するとエラーが発生します。エラー:
File "/media/elena/DATA2/Python-projects/osm-pois/osm-pois/upoi/poi/models/layer.py", line 8, in Layer
poi = models.ForeignKey(Poi, on_delete=models.CASCADE)
NameError: name 'Poi' is not defined
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)
これを解決する方法のアイデアはありますか?ありがとう!
@ TonySuffolk66が完璧に機能したので、コメントで提案したことを回答として投稿しています。再度、感謝します!
モデルは異なるファイルで定義されているため、次のようにしてみてください。poi= models.ForeignKey( 'Poi'、on_delete = models.CASCADE)これは、参照名ではなく、モデル名に文字列を使用しています。Djangoの初期化方法が原因で、このような他のモデルを「簡単に」インポートすることはできません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加