Ich versuche, eine Django-App mit mehreren Unteranwendungen zu erstellen. Meine aktuellen Verzeichnis-Layout für die App ist (filtert admin.py, test.py und views.py der Kürze halber):Django App mit Unterapps. app_labels für Unterapps und Fremdschlüsselbeziehungen zwischen ihnen
myapp
__init__.py
models.py
subapp1/
__init__.py
models.py
subapp2
__init__.py
models.py
Wo myapp/models.py wie folgt aussieht:
class Foo(models.Model):
name = models.CharField(max_length=32)
und myapp/subapp1/models.py wie folgt aussieht:
class Bar(models.Model):
foo = models.ForeignKey('myapp.Foo')
some_other_field = models.CharField(max_length=32)
und myapp/subapp2/models.py wie folgt aussieht:
class Baz(models.Model):
bar = models.ForeignKey('subapp1.Bar')
In meinem settings.py ich habe:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
'myapp.subapp1',
'myapp.subapp2'
)
aber wenn ich versuche, ./manage.py makemigrations myapp.subapp1
ich den Fehler zu laufen:
App 'myapp.subapp1' could not be found. Is it in INSTALLED_APPS?
Aber ich bin in der Lage, ./manage.py makemigrations subapp1
und das Äquivalent für Subapp2 erfolgreich auszuführen. Was mich beunruhigt, sind App-Namensraum-Kollisionen.
Wenn ich hinzufügen, ein myapp/subapp1/apps.py
from django.apps import AppConfig
class SubApp1Config(AppConfig):
name = 'myapp.subapp1'
label = 'myapp.subapp1'
und dann zu myapp/subapp1/__ init__.py
default_app_config = 'myapp.subapp1.apps.SubApp1Config'
das Äquivalent Sie für ‚myapp/subapp2 'und auskommentieren' myapp.app2 'von INSTALLED_APPS
Ich kann dannausführenerfolgreich.
aber wenn ich dann uncomment myapp.subapp2
von INSTALLED_APPS
und myapp/ändern subapp2/models.py aussehen:
class Baz(models.Model):
bar = models.ForeignKey('myapp.subapp1.Bar')
und dann ./manage.py makemigrations myapp.subapp2
laufen erhalte ich:
SystemCheckError: System check identified some issues:
ERRORS:
myapp.subapp2.Baz.bar: (fields.E300) Field defines a relation with model 'myapp.subapp1.Bar', which is either not installed, or is abstract.
Wie soll ich die Fremdschlüsselbeziehung zwischen myapp.subapp2.Baz.bar
und myapp.subapp1.Bar
?
Vielen Dank im Voraus.