2013-04-23 9 views
6

ho creato il seguente campo ForeignKey nel mio modello in una classe denominata "attività"Django ForeignKey classe legate problema non trovata

related_workoutrecord = models.ForeignKey(WorkoutRecord, null=True, blank=True) 

Il ForeignKey è correlata ad una classe denominata WorkoutRecord che dovrebbe essere permesso di essere vuoto.

Dopo aver aggiunto questa colonna ho corso Sud ed ho ottenuto il seguente messaggio di errore:

NameError: name 'WorkoutRecord' is not defined 

Ogni pensiero su quello che sta succedendo? Ho confermato che "WorkoutRecord" è una classe del mio modello.

ho bisogno di scrivere WorkoutRecord come una stringa (con le virgolette), ad esempio:

related_workoutrecord = models.ForeignKey('WorkoutRecord', null=True, blank=True) 

apprezzo le valutazioni

+1

Puoi pubblicare la tua modella? Anche l'ordine di dichiarazione è importante dove si trova la classe WorkoutRecord? –

+0

Se la definizione di 'WorkoutRecord' è sotto la definizione di' Activity' (nel codice) allora sì, dovresti scriverlo tra virgolette. –

risposta

8

Come per il mio commento, assicurarsi che la classe 'Activity' ha accesso alla classe 'WorkoutRecord'.

L'errore indica che cosa dice, che WorkoutRecord non è definito nella classe Attività.

controllare queste due cose: primo

1) Hai importarlo?

2) È stato definito WorkoutRecord prima dell'attività?

+1

Feedback impressionante! La definizione di WorkoutRecord era sotto la definizione di Activity (nel codice) quindi inserisco "WorkoutRecord" tra virgolette. Sembra un'altra opzione era quella di mettere attività sotto WorkoutRecord. (Non sapevo che l'ordine contava in questo caso). Grazie ancora! – bbrooke

+0

Sto utilizzando il sud per gestire le migrazioni di db. Sai perché WorkoutRecord deve essere definito prima di Activity anche se entrambi i modelli sono già stati migrati in precedenza nel db e sto solo aggiungendo il campo ForeignKey in una nuova migrazione? – Hat

0

Usa formato 'yourapp.Model'.

foo = models.ForeignKey('yourapp.WorkoutRecord', null=True, blank=True) 

Con citazioni.

3

La classe WorkoutRecord deve essere definita prima (vale a dire sopra) la classe Activity, in modo da utilizzare un riferimento alla classe senza virgolette. Se ci sono riferimenti circolari tra le classi, quindi l'uso della versione di stringa quotata funzionerà per ottenere un riferimento pigro alla classe definita più avanti nel codice.

1

si hanno due opzioni:

  1. È possibile importare il modello WorkoutRecord da qualunque modulo risiede (questo è l'approccio standard di Python)

    from myapp.models import WorkoutRecord 
    related_workoutrecord = models.ForeignKey(WorkoutRecord, null=True, blank=True) 
    

    Con questo approccio, a volte si può ottenere in una situazione in cui si dispone di importazioni circolari, quindi esiste un'alternativa:

  2. È possibile utilizzare una stringa come primo argomento per un ForeignKey o ManytoManyField per specificare il modello con cui si desidera creare una relazione. Questa è una caratteristica di Django.Se si guarda the documentation for ForeignKey relationships, si dice:

    Se è necessario creare una relazione su un modello che non è ancora stato definito, è possibile utilizzare il nome del modello, piuttosto che l'oggetto del modello stesso:

    Ciò significa che se il modello non è stato ancora definito, ma risiede nello stesso modulo (cioè è inferiore al codice corrente), è sufficiente utilizzare il nome del modello tra virgolette: 'WorkoutRecord', ma se il modello è in un altro applicazione/modulo è inoltre possibile specificarlo come stringa: 'myapp.WorkoutRecord'