Внешний ключ из одного приложения в другое в Django

Мне интересно, можно ли определить внешний ключ в файле 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

Нарушаю ли я правила, пытаясь таким образом связать два приложения вместе, или у меня просто неправильный синтаксис?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
108
0
41 834
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

ОК - я понял это. Вы можете это сделать, вам просто нужно использовать правильный синтаксис import. Правильный синтаксис:

from prototype.cf.models import Movie

Моя ошибка заключалась в том, что я не указывал часть этой строки .models. Ооо!

Иногда вам нужно использовать кавычки, а не импорт, так как вы можете получить файлы, импортирующие друг друга.

Sam Stoelinga 01.03.2012 08:29
Ответ принят как подходящий

Согласно документам, ваша вторая попытка должна сработать:

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')

Вы пробовали поместить это в кавычки?

Соответствующие документы можно найти здесь

Nathan Jones 10.02.2017 21:49

Можно ли иметь внешние ключи во многих приложениях? Я делаю проект, в котором много приложений со многими внешними ключами во многих приложениях внутри проекта. fyi, я уже начал вопрос, но жду ответов. stackoverflow.com/questions/55213918/…

Tian Loon 18.03.2019 10:52

Поздно, я знаю, но это в основном вопрос выбора и организации. У меня есть «внутренние» приложения, которые никогда не предназначены для внешнего использования. Они могут зависеть друг от друга и существуют в основном для того, чтобы предоставить мне удобную организацию моих файлов и пространств имен. Внешние приложения (например, из DjangoPackages) и приложения, которые я мог бы однажды внести в общедоступную информацию, должны быть как можно более свободными, поскольку такие зависимости могут быть максимально свободными (хотя зависимость от некоторых других хорошо поддерживаемых общедоступных приложений может быть приемлемой. общедоступные пользовательские приложения зависят от моделей пользователя / группы / разрешений Django).

nigel222 03.09.2019 11:24

Спасибо, у меня это сработало. Добавляя кавычки, нам не нужно импортировать класс. Но мне интересно, есть ли какие-нибудь различия, если мы решим импортировать класс, например, другой хороший пример, приведенный @andorov?

Michel Mesquita 18.09.2020 16:20

Также можно передать сам класс:

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

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

Другие вопросы по теме