Chiave esterna da un'app all'altra in Django


99

Mi chiedo se sia possibile definire una chiave esterna in un file models.py in Django che sia un riferimento a una tabella in un'altra app?

In altre parole, ho due app, chiamate cf e profiles, e in cf / models.py ho (tra le altre cose):

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

e in profiles / models.py voglio avere:

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

Ma non riesco a farlo funzionare. Ho provato:

    movie = models.ForeignKey(cf.Movie)

e ho provato a importare cf.Movie all'inizio di models.py, ma ottengo sempre errori, come ad esempio:

NameError: name 'User' is not defined

Sto infrangendo le regole cercando di legare insieme due app in questo modo o ho semplicemente sbagliato la sintassi?

Risposte:


153

Secondo i documenti, il tuo secondo tentativo dovrebbe funzionare:

Per fare riferimento a modelli definiti in un'altra applicazione, è invece necessario specificare esplicitamente l'etichetta dell'applicazione. Ad esempio, se il modello del produttore sopra è definito in un'altra applicazione chiamata produzione, è necessario utilizzare:

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

Hai provato a metterlo tra virgolette?


1
I documenti pertinenti possono essere trovati qui
Nathan Jones

Va bene avere chiavi esterne in molte app? Sto facendo un progetto con molte app con molte chiavi esterne su molte app all'interno di un progetto. Cordiali saluti, ho già iniziato la domanda ma in attesa di risposte. stackoverflow.com/questions/55213918/…
Tian Loon

In ritardo, lo so, ma è soprattutto una questione di scelta e organizzazione. Ho app "interne" che non sono mai destinate all'uso esterno. Possono dipendere l'uno dall'altro ed esistono principalmente per darmi una comoda organizzazione dei miei file e spazi dei nomi. Le app esterne (ad esempio da DjangoPackages) e le app che un giorno potrei contribuire al pubblico, devono essere mantenute il più libere possibile dalle dipendenze (sebbene la dipendenza da qualche altra app di dominio pubblico ben supportata potrebbe essere OK. Molte le app pubbliche relative agli utenti dipendono dai modelli utente / gruppo / autorizzazione di Django).
nigel222

25

È anche possibile superare la classe stessa:

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

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

9

OK, l'ho capito. Puoi farlo, devi solo usare la importsintassi giusta . La sintassi corretta è:

from prototype.cf.models import Movie

Il mio errore è stato non specificare la .modelsparte di quella riga. D'oh!


11
A volte è necessario utilizzare virgolette e non importazioni, poiché è possibile che i file si importino a vicenda.
Sam Stoelinga
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.