Clave externa de una aplicación a otra en Django

99

Me pregunto si es posible definir una clave externa en un archivo models.py en Django que sea una referencia a una tabla en otra aplicación.

En otras palabras, tengo dos aplicaciones, llamadas cf y profiles, y en cf / models.py tengo (entre otras cosas):

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

y en profiles / models.py quiero tener:

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

Pero no puedo hacer que funcione. He intentado:

    movie = models.ForeignKey(cf.Movie)

e intenté importar cf.Movie al comienzo de models.py, pero siempre obtengo errores, como:

NameError: name 'User' is not defined

¿Estoy rompiendo las reglas al tratar de unir dos aplicaciones de esta manera, o simplemente me equivoqué con la sintaxis?

Ben
fuente

Respuestas:

153

Según los documentos, su segundo intento debería funcionar:

Para hacer referencia a modelos definidos en otra aplicación, debe especificar explícitamente la etiqueta de la aplicación. Por ejemplo, si el modelo de fabricante anterior se define en otra aplicación denominada producción, deberá utilizar:

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

¿Ha intentado ponerlo entre comillas?

Michael Warkentin
fuente
1
Los documentos relevantes se pueden encontrar aquí
Nathan Jones
¿Está bien tener claves externas en muchas aplicaciones? Estoy haciendo un proyecto que tiene muchas aplicaciones con muchas claves externas en muchas aplicaciones dentro de un proyecto. Para tu información, ya comencé la pregunta pero estoy esperando respuestas. stackoverflow.com/questions/55213918/…
Tian Loon
Tarde, lo sé, pero es sobre todo una cuestión de elección y organización. Tengo aplicaciones "internas" que nunca están diseñadas para uso externo. Pueden depender unos de otros y existen principalmente para brindarme una organización conveniente de mis archivos y espacios de nombres. Las aplicaciones externas (por ejemplo, de DjangoPackages) y las aplicaciones que algún día podría contribuir al público, deben mantenerse tan libres como sea posible (aunque la dependencia de alguna otra aplicación de dominio público bien soportada podría estar bien. las aplicaciones públicas relacionadas con el usuario dependen de los modelos de usuario / grupo / permiso de Django).
nigel222
25

También es posible aprobar la clase en sí:

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

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

De acuerdo, lo he descubierto. Puedes hacerlo, solo tienes que usar la importsintaxis correcta . La sintaxis correcta es:

from prototype.cf.models import Movie

Mi error fue no especificar la .modelsparte de esa línea. ¡Oh!

Ben
fuente
11
A veces es necesario utilizar comillas y no importaciones, ya que es posible que los archivos se importen entre sí.
Sam Stoelinga