Chave estrangeira de um aplicativo para outro no Django

94

Estou me perguntando se é possível definir uma chave estrangeira em um arquivo models.py no Django que é uma referência a uma tabela em outro aplicativo?

Em outras palavras, tenho dois aplicativos, chamados cf e profiles, e em cf / models.py tenho (entre outras coisas):

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

e em profiles / models.py eu quero ter:

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

Mas não consigo fazer funcionar. Eu tentei:

    movie = models.ForeignKey(cf.Movie)

e tentei importar cf.Movie no início de models.py, mas sempre recebo erros, como:

NameError: name 'User' is not defined

Estou quebrando as regras ao tentar amarrar dois aplicativos dessa maneira ou apenas entendi a sintaxe errada?

Ben
fonte

Respostas:

150

De acordo com os documentos, sua segunda tentativa deve funcionar:

Para fazer referência a modelos definidos em outro aplicativo, você deve especificar explicitamente o rótulo do aplicativo. Por exemplo, se o modelo de fabricante acima for definido em outro aplicativo chamado produção, você precisará usar:

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

Você já tentou colocá-lo entre aspas?

Michael Warkentin
fonte
1
Documentos relevantes podem ser encontrados aqui
Nathan Jones
É normal ter chaves estrangeiras em muitos aplicativos? Estou fazendo um projeto com muitos aplicativos com muitas chaves estrangeiras em muitos aplicativos dentro de um projeto. Fyi, já comecei a pergunta, mas esperando por respostas. stackoverflow.com/questions/55213918/…
Tian Loon
Tarde, eu sei, mas é principalmente uma questão de escolha e organização. Tenho aplicativos "internos" que nunca se destinam ao uso externo. Eles podem depender um do outro e existir principalmente para me fornecer uma organização conveniente de meus arquivos e namespaces. Aplicativos externos (por exemplo, de DjangoPackages) e aplicativos que eu possa um dia contribuir com o público, precisam ser mantidos tão livres quanto possível (embora depender de algum outro aplicativo de domínio público bem suportado possa ser OK. aplicativos públicos relacionados ao usuário dependem dos modelos de usuário / grupo / permissão do Django).
nigel222
23

Também é possível passar na própria aula:

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

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

OK - eu descobri. Você pode fazer isso, basta usar a importsintaxe certa . A sintaxe correta é:

from prototype.cf.models import Movie

Meu erro foi não especificar a .modelsparte dessa linha. D'oh!

Ben
fonte
10
Às vezes você tem que usar aspas e não importações, pois você pode obter arquivos importando uns aos outros.
Sam Stoelinga