Ausgabe
Ich habe also 2 Apps, die im selben Projekt ausgeführt werden.
Meine Dateien sind wie folgt aufgebaut:
/project_codebase
/project
__init.py
settings.py
urls.py
wsgi.py
...
/app1
...
/app2
...
manage.py
Also habe ich aus irgendeinem seltsamen Grund einen anderen Namen für mein Basisverzeichnis (das heißt, es endet mit Codebase). Hoffentlich ist das kein Problem.
In meiner settings.py habe ich folgendes:
INSTALLED_APPS = [
...
'app1',
'app2',
]
Ok, also in my models.py (from app2) kann ich leicht Modelle aus app1 mit importieren from app1.models import *
, aber wenn ich from app2.models import *
in my models.py (from app1) verwende , erhalte ich einen ImportError.
Irgendwelche Lösungen dazu?
Lösung
Dies kann auf Probleme beim zirkulären Import zurückzuführen sein. Um dies zu vermeiden, sollten Sie das Modell dynamisch laden :
Verwenden Sie für neuere Versionen von Django (1.7+) die Anwendungsregistrierung :
from django.apps import apps
MyModel1 = apps.get_model('app1', 'MyModel1')
Für frühere Django-Versionen (<1.7) :
from django.db.models.loading import get_model
MyModel1 = get_model('app1', 'MyModel1')
Hinweis 1: Wenn Sie eine ForeignKey-Beziehung definieren möchten , ist keine separate Import-Anweisung erforderlich . Django hat Sie darüber informiert:
Wenn app1
es sich um eine installierte App handelt, sollten Sie die ForeignKey-Beziehung wie folgt definieren:
# in app2.py
class MyModel2(models.Model):
mymodel1 = models.ForeignKey('app1.MyModel1')
Hinweis 2 : Das get_model
funktioniert nur, wenn app1
es sich um eine installierte App und MyModel1
das Modell handelt, aus dem Sie importieren möchten app1
.
Hinweis 3: Versuchen Sie, den Wildcard-Import ( from ... import *
) zu vermeiden, da dies eine schlechte Praxis ist .
Beantwortet von – jojo
Antwort geprüft von – Robin (FixError Admin)