2013-04-23 16 views
6

Utworzyłem następujące pola ForeignKey w moim modelu klasy pod nazwą „aktywny”Django ForeignKey problem związany klasa nie znaleziono

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

ForeignKey jest związany z klasy o nazwie WorkoutRecord które powinny być dozwolone pusty.

Po dodaniu tej kolumny wpadłem Południowej i uzyskałem następujący komunikat o błędzie:

NameError: name 'WorkoutRecord' is not defined 

jakieś przemyślenia na temat tego, co się dzieje? Potwierdziłem, że "WorkoutRecord" jest klasą w moim modelu.

Czy muszę pisać WorkoutRecord jako ciąg (z cytatami), na przykład:

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

Doceniam sprzężenia zwrotnego

+1

Czy możesz zamieścić swój model? Kolejność deklaracji ma również znaczenie, gdzie jest klasa WorkoutRecord? –

+0

Jeśli definicja 'WorkoutRecord' jest pod definicją' Activity' (w kodzie), to tak, powinieneś zapisać ją w cudzysłowie. –

Odpowiedz

8

Jak na mój komentarz, upewnij się, że klasa „aktywny” ma dostęp do klasy „WorkoutRecord”.

Błąd oznacza to, co mówi, że WorkoutRecord nie jest zdefiniowany w twojej klasie aktywności.

Sprawdź te dwie rzeczy pierwsze:

1) Czy importować?

2) Czy WorkoutRecord zdefiniowano przed działaniem?

+1

Awesome feedback! Definicja WorkoutRecord była pod definicją Activity (w kodzie), więc umieszczam "WorkoutRecord" pomiędzy cytatami. Wydaje się, że inną opcją było umieszczenie działania poniżej WorkoutRecord. (Nie wiedziałem, jaki porządek ma znaczenie w tym przypadku). Dzięki jeszcze raz! – bbrooke

+0

Używam strony południowej do zarządzania migracjami db. Czy wiesz, dlaczego program WorkoutRecord musi zostać zdefiniowany przed działaniem, nawet jeśli oba modele zostały już wcześniej poddane migracji do bazy danych i dodaje tylko pole ForeignKey w nowej migracji? – Hat

0

użyć formatu 'yourapp.Model'.

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

Z cytatami.

3

Klasa WorkoutRecord musi być zdefiniowana przed (tj. Powyżej) klasą Activity, aby użyć odniesienia do klasy bez cudzysłowów. Jeśli istnieją odwołania kołowe między klasami, użycie cytowanej wersji ciągu będzie działać, aby uzyskać leniwy odniesienie do klasy zdefiniowanej później w kodzie.

1

Masz dwie opcje:

  1. można importować WorkoutRecord model z cokolwiek moduł to rezyduje (jest to standardowe podejście python)

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

    Stosując to podejście, czasami można dostać do sytuacji, w której importowany jest cyklicznie, więc istnieje alternatywa:

  2. Możesz użyć ciągu jako pierwszego argumentu ForeignKey lub ManytoManyField, aby określić model, z którym chcesz utworzyć relację. To jest funkcja django.Jeśli spojrzeć na the documentation for ForeignKey relationships, to mówi:

    jeśli trzeba utworzyć relację na modelu, który nie został jeszcze zdefiniowany, można użyć nazwy modelu, zamiast samego obiektu modelu:

    Oznacza to, że jeśli model nie został jeszcze zdefiniowany, ale znajduje się w tym samym module (tj. Znajduje się poniżej bieżącego kodu), można po prostu użyć nazwy modelu w cudzysłowie: 'WorkoutRecord', ale jeśli model znajduje się w innym Aplikacja/moduł można również określić jako ciąg: 'myapp.WorkoutRecord'

Powiązane problemy