web-dev-qa-db-fra.com

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

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 je reçois toujours des erreurs, telles que:

NameError: name 'User' is not defined

Suis-je en train d'enfreindre les règles en essayant de lier deux applications ensemble de cette manière, ou ai-je juste une mauvaise syntaxe?

83
Ben

Selon les documents, votre deuxième tentative devrait fonctionner:

Pour faire référence aux modèles définis dans une autre application, vous devez plutôt spécifier explicitement le libellé de l'application. Par exemple, si le modèle 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?

136
Michael Warkentin

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)
22
andorov

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

from prototype.cf.models import Movie

Mon erreur ne spécifiait pas le .models partie de cette ligne. Oh!

9
Ben