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

101

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

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

Бен
источник

Ответы:

157

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

Чтобы ссылаться на модели, определенные в другом приложении, вы должны вместо этого явно указать метку приложения. Например, если указанная выше модель производителя определена в другом приложении под названием production, вам нужно будет использовать:

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

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

Майкл Варкентин
источник
1
Соответствующие документы можно найти здесь
Натан Джонс
Можно ли иметь внешние ключи во многих приложениях? Я делаю проект, в котором есть много приложений со многими внешними ключами во многих приложениях в рамках проекта. fyi, я уже начал вопрос, но жду ответов. stackoverflow.com/questions/55213918/…
Тиан Лун
Поздно, я знаю, но это в основном вопрос выбора и организации. У меня есть «внутренние» приложения, которые никогда не предназначены для внешнего использования. Они могут зависеть друг от друга и существуют в основном для того, чтобы предоставить мне удобную организацию моих файлов и пространств имен. Внешние приложения (например, из DjangoPackages) и приложения, которые я мог бы однажды внести в общедоступные, должны быть максимально свободными, поскольку такие зависимости могут быть (хотя зависимость от некоторых других хорошо поддерживаемых общедоступных приложений может быть приемлемой. общедоступные приложения, связанные с пользователем, зависят от моделей пользователей / групп / разрешений Django).
nigel222 03
Спасибо, у меня это сработало. Добавляя кавычки, нам не нужно импортировать класс. Но мне интересно, есть ли какие-то различия, если мы решим импортировать класс, например, другой хороший пример, данный @andorov?
Мишель Мескита,
27

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

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

class Car(models.Model):
    manufacturer = models.ForeignKey(production_models.Manufacturer)
Андоров
источник
10

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

from prototype.cf.models import Movie

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

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