Зовнішній ключ від одного додатка до іншого в Django


99

Цікаво, чи можливо визначити зовнішній ключ у файлі models.py у Django, який є посиланням на таблицю в іншому додатку?

Іншими словами, у мене є дві програми, які називаються cf і профілі, а в cf / models.py у мене є (серед іншого):

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

а в profile / 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

Я порушую правила, намагаючись зв’язати два додатки таким чином, або я просто помилився в синтаксисі?

Відповіді:


153

Згідно з документами, ваша друга спроба повинна працювати:

Для посилання на моделі, визначені в іншій програмі, натомість потрібно чітко вказати ярлик програми. Наприклад, якщо модель виробника, вказана вище, визначена в іншому додатку, який називається виробничим, вам потрібно буде використовувати:

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

Ви пробували вводити це в лапки?


1
Відповідні документи можна знайти тут
Nathan Jones

Чи нормально мати зовнішні ключі в багатьох додатках? Я роблю проект із багатьма програмами із безліччю зовнішніх ключів для багатьох програм у проекті. fyi, я вже розпочав питання, але чекаю відповіді. stackoverflow.com/questions/55213918/…
Тіан Лун

Пізно, я знаю, але це здебільшого питання вибору та організації. У мене є "внутрішні" програми, які ніколи не призначені для зовнішнього використання. Вони можуть залежати один від одного і існувати в основному для того, щоб дати мені зручну організацію моїх файлів та просторів імен. Зовнішні програми (наприклад, від DjangoPackages) та додатки, які я колись можу зробити публічно доступними, повинні бути якомога вільнішими (залежно від можливостей таких залежностей) (хоча залежність від деяких інших добре підтримуваних програм державного домену може бути нормальною. Багато загальнодоступні програми, що стосуються користувачів, залежать від моделей користувача / групи / дозволу Django).
nigel222

24

Також можна пройти сам клас:

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

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

9

Добре - я все зрозумів. Ви можете це зробити, вам просто потрібно використовувати правильний importсинтаксис. Правильний синтаксис:

from prototype.cf.models import Movie

Моєю помилкою було не вказання .modelsчастини цього рядка. Ой!


11
Іноді доводиться використовувати лапки, а не імпортувати, оскільки файли можуть імпортувати один одного.
Сем Стоелінга 01.03.12
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.