Мне интересно, можно ли определить внешний ключ в файле models.py в Django, который является ссылкой на таблицу в другом приложении?
Другими словами, у меня есть два приложения, называемые cf и profiles, а в cf / models.py у меня есть (среди прочего):
class Movie(models.Model):
title = models.CharField(max_length=255)
и в profiles / models.py я хочу иметь:
class MovieProperty(models.Model):
movie = models.ForeignKey(Movie)
Но я не могу заставить его работать. Я пробовал:
movie = models.ForeignKey(cf.Movie)
и я пробовал импортировать cf.Movie в начале models.py, но всегда получаю ошибки, например:
NameError: name 'User' is not defined
Нарушаю ли я правила, пытаясь таким образом связать два приложения вместе, или у меня просто неправильный синтаксис?






ОК - я понял это. Вы можете это сделать, вам просто нужно использовать правильный синтаксис import. Правильный синтаксис:
from prototype.cf.models import Movie
Моя ошибка заключалась в том, что я не указывал часть этой строки .models. Ооо!
Согласно документам, ваша вторая попытка должна сработать:
To refer to models defined in another application, you must instead explicitly specify the application label. For example, if the Manufacturer model above is defined in another application called production, you'd need to use:
class Car(models.Model):
manufacturer = models.ForeignKey('production.Manufacturer')
Вы пробовали поместить это в кавычки?
Соответствующие документы можно найти здесь
Можно ли иметь внешние ключи во многих приложениях? Я делаю проект, в котором много приложений со многими внешними ключами во многих приложениях внутри проекта. fyi, я уже начал вопрос, но жду ответов. stackoverflow.com/questions/55213918/…
Поздно, я знаю, но это в основном вопрос выбора и организации. У меня есть «внутренние» приложения, которые никогда не предназначены для внешнего использования. Они могут зависеть друг от друга и существуют в основном для того, чтобы предоставить мне удобную организацию моих файлов и пространств имен. Внешние приложения (например, из DjangoPackages) и приложения, которые я мог бы однажды внести в общедоступную информацию, должны быть как можно более свободными, поскольку такие зависимости могут быть максимально свободными (хотя зависимость от некоторых других хорошо поддерживаемых общедоступных приложений может быть приемлемой. общедоступные пользовательские приложения зависят от моделей пользователя / группы / разрешений Django).
Спасибо, у меня это сработало. Добавляя кавычки, нам не нужно импортировать класс. Но мне интересно, есть ли какие-нибудь различия, если мы решим импортировать класс, например, другой хороший пример, приведенный @andorov?
Также можно передать сам класс:
from django.db import models
from production import models as production_models
class Car(models.Model):
manufacturer = models.ForeignKey(production_models.Manufacturer)
Иногда вам нужно использовать кавычки, а не импорт, так как вы можете получить файлы, импортирующие друг друга.