0

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.

Antwort

0

Ich habe das schon vor langer Zeit herausgefunden, aber ich denke, ich sollte keine Frage unbeantwortet lassen. Ich musste das nicht nutzen - es war nur eine Übung, um einen Teil einer App optional zu machen.Da ich einen Fremdschlüssel zwischen den optionalen Subapps hatte, war das ein wenig kompliziert. Ich versuchte nur herauszufinden, wie ich sie referenzieren sollte.

Es stellte sich heraus, war ich einfach verwirrt zwischen dem app_label und was Sie setzen in INSTALLED_APPS

In diesem Fall würde ich einfach die app_labels zu myapp_subapp1 und myapp_subapp2 gesetzt, aber in INSTALLED_APPS, würden sie installiert werden als myapp.subapp1 und myapp.subapp2.

Dies listet sowohl die subapps, wenn Sie geben ./manage.py showmigrations als myapp_subapp1 und myapp_subapp2 statt subapp1 und subapp2, die als SubApp mit einem echten Namen mit etwas könnte kollidieren sonst beunruhigend war. Zum Beispiel mag ich nicht, wie django-mutant nicht funktioniert Namespace es contrib Zeug, so dass Sie am Ende mit app_labels wie web, text, welche könnte völlig Klasse mit etwas statt mutant_web usw.

dann bei der Verwendung von Fremdschlüssel würden sie als myapp_subapp1.Bar referenziert werden anstelle von dem, was ich vorher tat als 'myappsapp1.Bar'