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ę?

Ben
źródło

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?

Michael Warkentin
źródło
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)
Andorov
źródło
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!

Ben
źródło
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