Fremdschlüssel von einer App in eine andere in Django

93

Ich frage mich, ob es möglich ist, einen Fremdschlüssel in einer Datei models.py in Django zu definieren, der auf eine Tabelle in einer anderen App verweist.

Mit anderen Worten, ich habe zwei Apps, cf und Profile, und in cf / models.py habe ich (unter anderem):

class Movie(models.Model):
    title = models.CharField(max_length=255)

und in profile / models.py möchte ich haben:

class MovieProperty(models.Model):
    movie = models.ForeignKey(Movie)

Aber ich kann es nicht zum Laufen bringen. Ich habe es versucht:

    movie = models.ForeignKey(cf.Movie)

und ich habe versucht, cf.Movie am Anfang von models.py zu importieren, aber ich erhalte immer Fehler, wie zum Beispiel:

NameError: name 'User' is not defined

Verstoße ich gegen die Regeln, indem ich versuche, zwei Apps auf diese Weise miteinander zu verbinden, oder habe ich gerade die falsche Syntax?

Ben
quelle

Antworten:

149

Laut den Dokumenten sollte Ihr zweiter Versuch funktionieren:

Um auf Modelle zu verweisen, die in einer anderen Anwendung definiert sind, müssen Sie stattdessen die Anwendungsbezeichnung explizit angeben. Wenn das oben genannte Herstellermodell beispielsweise in einer anderen Anwendung namens Produktion definiert ist, müssen Sie Folgendes verwenden:

class Car(models.Model):
    manufacturer = models.ForeignKey('production.Manufacturer')

Haben Sie versucht, es in Anführungszeichen zu setzen?

Michael Warkentin
quelle
1
Relevante Dokumente finden Sie hier
Nathan Jones
Ist es in Ordnung, Fremdschlüssel in vielen Apps zu haben? Ich mache ein Projekt mit vielen Apps mit vielen Fremdschlüsseln über viele Apps innerhalb eines Projekts. Zu Ihrer Information, ich habe die Frage bereits gestartet, aber auf Antworten gewartet. stackoverflow.com/questions/55213918/…
Tian Loon
Spät, ich weiß, aber es ist meistens eine Frage der Wahl und Organisation. Ich habe "interne" Apps, die niemals für den externen Gebrauch bestimmt sind. Sie können voneinander abhängen und existieren hauptsächlich, um mir eine bequeme Organisation meiner Dateien und Namespaces zu ermöglichen. Externe Apps (z. B. von DjangoPackages) und Apps, die ich eines Tages zur Öffentlichkeit beitragen könnte, müssen so frei wie möglich gehalten werden (obwohl die Abhängigkeit von einer anderen gut unterstützten Public-Domain-App in Ordnung sein kann. Viele davon Öffentliche benutzerbezogene Apps hängen von den Benutzer- / Gruppen- / Berechtigungsmodellen von Django ab.
Nigel222
23

Es ist auch möglich, die Klasse selbst zu bestehen:

from django.db import models
from production import models as production_models

class Car(models.Model):
    manufacturer = models.ForeignKey(production_models.Manufacturer)
andorov
quelle
9

OK - ich habe es herausgefunden. Sie können es tun, Sie müssen nur die richtige importSyntax verwenden. Die richtige Syntax lautet:

from prototype.cf.models import Movie

Mein Fehler war, den .modelsTeil dieser Zeile nicht anzugeben . D'oh!

Ben
quelle
10
Manchmal müssen Sie Anführungszeichen und keine Importe verwenden, da sich möglicherweise Dateien gegenseitig importieren.
Sam Stoelinga