2013-04-23 8 views
6

Ich habe folgendes ForeignKey Feld in meinem Modell unter einer Klasse namens „Activity“ erstelltDjango ForeignKey Problem im Zusammenhang Klasse nicht gefunden

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

Die ForeignKey zu einer Klasse verwandt ist WorkoutRecord genannt, die erlaubt sein sollte, sein leer.

Nach dem Hinzufügen dieser Spalte I Süd lief und bekam die folgende Fehlermeldung:

NameError: name 'WorkoutRecord' is not defined 

Irgendwelche Gedanken auf, was los ist? Ich habe bestätigt, dass 'WorkoutRecord' eine Klasse in meinem Modell ist.

Muss ich WorkoutRecord als String (mit Anführungszeichen) beispielsweise schreiben müssen:

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

Ich schätze die Feedback

+1

Können Sie Ihr Modell veröffentlichen? Die Reihenfolge der Deklarationen spielt auch eine Rolle wo ist die WorkoutRecord-Klasse? –

+0

Wenn die Definition von 'WorkoutRecord' unter der Definition von' Activity' (im Code) steht, dann sollten Sie sie zwischen Anführungszeichen schreiben. –

Antwort

8

Per meinem Kommentar sicher, dass die Klasse ‚Aktivität‘ Zugriff auf die Klasse hat ‚WorkoutRecord‘.

Der Fehler bedeutet, dass WorkoutRecord in Ihrer Aktivitätsklasse nicht definiert ist.

Schauen Sie sich diese zwei Dinge zuerst:

1) Haben Sie es importieren?

2) Wurde WorkoutRecord vor der Aktivität definiert?

+1

Super Feedback! Die Definition von WorkoutRecord stand unter der Definition von Activity (im Code), also habe ich "WorkoutRecord" zwischen Anführungszeichen gesetzt. Es scheint eine andere Option zu sein, die Aktivität unterhalb von WorkoutRecord zu setzen. (Ich wusste nicht, dass die Reihenfolge in diesem Fall wichtig ist). Danke noch einmal! – bbrooke

+0

Ich verwende South, um Datenbankmigrationen zu verwalten. Wissen Sie, warum WorkoutRecord vor Activity definiert werden muss, auch wenn beide Modelle bereits zuvor in die Datenbank migriert wurden und ich das Feld ForeignKey nur in einer neuen Migration hinzufüge? – Hat

0

Verwendung 'yourapp.Model' Format.

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

Mit Anführungszeichen.

3

Die WorkoutRecord-Klasse muss vor (also oberhalb) der Activity-Klasse definiert werden, um einen Verweis auf die Klasse ohne Anführungszeichen verwenden zu können. Wenn zwischen den Klassen Zirkelverweise vorhanden sind, funktioniert die Verwendung der String-Version in Anführungszeichen, um einen verzögerten Verweis auf die später in Ihrem Code definierte Klasse zu erhalten.

1

Sie haben zwei Möglichkeiten:

  1. können Sie importieren die WorkoutRecord Modell aus, was auch immer Modul es sich befindet (dies ist der Standard-Python-Ansatz)

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

    Mit diesem Ansatz, manchmal kann man bekommen in eine Situation, wo Sie kreisförmige Importe haben, so gibt es eine Alternative:

  2. Sie können eine Zeichenfolge als erstes Argument für eine verwenden ForeignKey oder ManytoManyField, um das Modell anzugeben, mit dem Sie die Beziehung herstellen möchten. Dies ist eine Django-Funktion.Wenn man sich the documentation for ForeignKey relationships aussehen, heißt es:

    Wenn Sie eine Beziehung auf ein Modell erstellen, die noch nicht definiert wurde, können Sie den Namen des Modells verwenden können, anstatt das Modellobjekt selbst:

    Diese

    bedeutet, dass, wenn das Modell noch nicht definiert worden, aber wohnt im selben Modul (dh es unter Ihrem aktuellen Code ist), können Sie nur den Modellnamen in Anführungszeichen verwenden: 'WorkoutRecord', aber wenn das Modell in einem anderen ist Anwendung/Modul können Sie das auch als String angeben: 'myapp.WorkoutRecord'