Klucz obcy z jednej aplikacji do drugiej w Django


101

Zastanawiam się, czy można zdefiniować klucz obcy w pliku models.py w Django, który jest odniesieniem do tabeli w innej aplikacji?

Innymi słowy, mam dwie aplikacje, zwane cf i profiles, aw cf / models.py mam (między innymi):

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

a w profiles / models.py chcę mieć:

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

Ale nie mogę zmusić tego do pracy. Próbowałem:

    movie = models.ForeignKey(cf.Movie)

i próbowałem zaimportować cf.Movie na początku models.py, ale zawsze otrzymuję błędy, takie jak:

NameError: name 'User' is not defined

Czy łamię zasady, próbując powiązać ze sobą dwie aplikacje w ten sposób, czy po prostu źle zrozumiałem składnię?

Odpowiedzi:


157

Według dokumentacji Twoja druga próba powinna zadziałać:

Aby odwołać się do modeli zdefiniowanych w innej aplikacji, należy zamiast tego jawnie określić etykietę aplikacji. Na przykład, jeśli powyższy model producenta jest zdefiniowany w innej aplikacji o nazwie produkcja, musisz użyć:

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

Czy próbowałeś umieścić to w cudzysłowie?


1
Odpowiednie dokumenty można znaleźć tutaj
Nathan Jones,

Czy można mieć klucze obce w wielu aplikacjach? Robię projekt, w którym jest wiele aplikacji z wieloma kluczami obcymi w wielu aplikacjach w projekcie. fyi, już zacząłem pytanie, ale czekam na odpowiedzi. stackoverflow.com/questions/55213918/…
Tian Loon

Wiem, późno, ale to głównie kwestia wyboru i organizacji. Mam aplikacje „wewnętrzne”, które nigdy nie są przeznaczone do użytku zewnętrznego. Mogą na sobie polegać i istnieją głównie po to, aby zapewnić mi wygodną organizację moich plików i przestrzeni nazw. Aplikacje zewnętrzne (np. Z DjangoPackages) i aplikacje, które pewnego dnia mogę udostępnić publicznie, muszą być jak najbardziej wolne jako takie zależności (chociaż zależność od innych dobrze obsługiwanych aplikacji z domeny publicznej może być w porządku. publiczne aplikacje związane z użytkownikami zależą od modelu użytkownika / grupy / uprawnień Django).
nigel222

Dzięki, to zadziałało dla mnie. Dodając cytaty, nie musimy importować klasy. Ale zastanawiam się, czy są jakieś różnice, jeśli zdecydujemy się zaimportować klasę, jak na przykład inny fajny przykład podany przez @andorov?
Michel Mesquita

27

Możliwe jest również zaliczenie samych zajęć:

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

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

10

OK - wymyśliłem to. Możesz to zrobić, wystarczy użyć odpowiedniej importskładni. Prawidłowa składnia to:

from prototype.cf.models import Movie

Moim błędem nie było określenie .modelsczęści tej linii. D'oh!


11
Czasami musisz używać cudzysłowów, a nie importować, ponieważ możesz dostać pliki, które będą się nawzajem importować.
Sam Stoelinga
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.