Clé étrangère d'une application à une autre dans Django

97

Je me demande s'il est possible de définir une clé étrangère dans un fichier models.py dans Django qui est une référence à une table dans une autre application?

En d'autres termes, j'ai deux applications, appelées cf et profiles, et dans cf / models.py j'ai (entre autres):

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

et dans profiles / models.py je veux avoir:

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

Mais je ne peux pas le faire fonctionner. J'ai essayé:

    movie = models.ForeignKey(cf.Movie)

et j'ai essayé d'importer cf.Movie au début de models.py, mais j'obtiens toujours des erreurs, telles que:

NameError: name 'User' is not defined

Est-ce que j'enfreins les règles en essayant de lier deux applications ensemble de cette manière, ou ai-je juste une mauvaise syntaxe?

Ben
la source

Réponses:

152

Selon la documentation, votre deuxième tentative devrait fonctionner:

Pour faire référence à des modèles définis dans une autre application, vous devez à la place spécifier explicitement le libellé de l'application. Par exemple, si le modèle de fabricant ci-dessus est défini dans une autre application appelée production, vous devez utiliser:

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

Avez-vous essayé de le mettre entre guillemets?

Michael Warkentin
la source
1
Les documents pertinents peuvent être trouvés ici
Nathan Jones
Est-il acceptable d'avoir des clés étrangères dans de nombreuses applications? Je fais un projet avec de nombreuses applications avec de nombreuses clés étrangères dans de nombreuses applications au sein d'un projet. Pour info, j'ai déjà commencé la question mais j'attends des réponses. stackoverflow.com/questions/55213918/…
Tian Loon
Tard, je sais, mais c'est surtout une question de choix et d'organisation. J'ai des applications "internes" qui ne sont jamais destinées à un usage externe. Ils peuvent dépendre les uns des autres et exister principalement pour me donner une organisation pratique de mes fichiers et espaces de noms. Les applications externes (par exemple de DjangoPackages) et les applications que je pourrais un jour contribuer au public, doivent être gardées aussi libres que possible en tant que dépendances (bien que la dépendance à une autre application du domaine public bien prise en charge puisse être acceptable. les applications publiques liées aux utilisateurs dépendent des modèles utilisateur / groupe / autorisation de Django).
nigel222
24

Il est également possible de passer la classe elle-même:

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

class Car(models.Model):
    manufacturer = models.ForeignKey(production_models.Manufacturer)
Andorov
la source
9

OK - je l'ai compris. Vous pouvez le faire, il vous suffit d'utiliser la bonne importsyntaxe. La syntaxe correcte est:

from prototype.cf.models import Movie

Mon erreur n'a pas été de spécifier la .modelspartie de cette ligne. Oh!

Ben
la source
11
Parfois, vous devez utiliser des guillemets et non des importations, car des fichiers peuvent s’importer les uns les autres.
Sam Stoelinga