Ошибка импорта Django из внешнего ключа в другой модели приложения - PullRequest
3 голосов
/ 15 апреля 2011

Я последовал этому посту здесь и разобрался, как установить ForeignKey одной модели для модели в другом приложении.Однако, когда я пытаюсь повторить попытку, я получаю сообщение об ошибке и не уверен, почему.

У меня есть приложение Central с моделями для «проекта» и «аннотации», а также приложение «Отчеты» с моделью отчета.У «аннотации» есть FK для «отчета» в приложении «Отчеты», и это, кажется, хорошо работает с этим кодом:

#models.py for Central app
from GIanno.pt_reports.models import Report

class annotation(models.Model):
    ... 
    report=models.ForeignKey(Report)

Но в приложении «Отчеты», когда я пытаюсь установить FKдля «отчета», чтобы связать его с «проектом» из приложения «Central» в том же формате, что и выше, я получаю сообщение об ошибке «не удается импортировать имя« проект »из строки импорта.

Любые идеио том, почему он работает в одну сторону, а не в другую. Имеет ли значение порядок? Спасибо

Ответы [ 3 ]

8 голосов
/ 15 апреля 2011

Я предполагаю, что вы создали условие кругового импорта. Это происходит, когда вы импортируете что-то из одного модуля Python, который, в свою очередь, импортирует из модуля, который пытается импортировать его, что препятствует разрешению импорта.

В целом существует три стратегии для работы с круговым импортом, две из которых будут работать в этом случае:

  1. Перемещайтесь по классам и импорту, чтобы импорт шел только в одном направлении.

  2. Используйте ленивый анализ. В случае Django это может быть достигнуто для ForeignKey путем передачи строки, определяющей имя приложения и модель, используя точечную запись: report=models.ForeignKey('central.Report')

  3. Переместите оператор импорта из глобальной области видимости модуля в область функции внутри модуля. Таким образом, импорт не оценивается сразу, и модуль может быть успешно импортирован как единое целое, в то же время позволяя импортировать его в модуль при его вызове. (Примечание: это не будет работать для отношений ForeignKey)

Ленивое разрешение FK (# 2), вероятно, является лучшим выбором. В целом, хотя лучшая стратегия состоит в том, чтобы упростить компоновку вашей модели / модуля, чтобы по возможности избежать циклического импорта.

1 голос
/ 15 апреля 2011

Попробуйте:

class annotation(models.Model):
    ... 
    report=models.ForeignKey('centralapp.Report')

Замените «centralapp» на имя вашего центрального приложения без необходимости импорта.

Lazy Relationships

0 голосов
/ 31 августа 2013

Другой сценарий, в котором Lazy Relationships может быть полезен, это порядок импорта.Это не циклическая ссылка (где он не может сказать, кто первый), а случай, когда один кусок кода загружается раньше, чем другой.

Например, допустим, у меня есть модель документа и журналМодель.Модель журнала имеет FK для документа, поэтому я могу записывать изменения в документе.Это работает нормально, пока, скажем, я не попытаюсь сгенерировать запись журнала в моем методе сохранения для моей модели Doc (чтобы сделать запись журнала событий сохранения).В этом случае в объекте Doc нет Log PK, но есть похожая проблема.

В этом случае вы получаете проблему с порядком импорта, когда вы попытаетесь сослаться на то, что еще не было загружено в Python.Это похоже на Циркулярное руководство, но по другой причине.

Это можно решить другими способами, но это еще один пример, где вы столкнетесь с этой проблемой.

...