Django ImportError: невозможно импортировать имя ReporterProfile из частично инициализированного модуля accounts.models (скорее всего, из-за циклического импорта) - PullRequest
0 голосов
/ 30 мая 2020

У меня есть два приложения с именами collection, accounts. Оба приложения имеют определенные модели. Я импортирую модель ReporterProfile из приложения accounts в collection. Аналогично, модель Report из приложения collection в accounts.

Модель Report из приложения collection вызывается в методе класса модели в приложении accounts следующим образом:

from collection.models import Report

class ReporterProfile(models.Model):
    ....

    def published_articles_number(self):
        num = Report.objects.filter(reporterprofile=self.id).count()
        return num

Точно так же я импортирую модели ReporterProfile и User из приложения accounts в модель приложения collection следующим образом:

from accounts.models import ReporterProfile, User
from <project_name> import settings

class Report(models.Model):
    reporterprofile = models.ForeignKey(ReporterProfile, on_delete=models.CASCADE, verbose_name="Report Author")
    ...

class Comment(models.Model):
    report = models.ForeignKey(Report, on_delete=models.CASCADE, related_name='comments')
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Comment by")
    ...

При запуске сервера или при выполнении миграции , Я получаю сообщение об ошибке:

Файл «F: \ project_name \ accounts \ models.py», строка 8, в отчете об импорте collection.models

Файл «F: \ project_name \ collection \ models.py», строка 2, в from accounts.models import ReporterProfile, User

ImportError: невозможно импортировать имя 'ReporterProfile' из частично инициализированный модуль accounts.models (скорее всего, из-за циклического импорта) (F: \ project_name \ accounts \ models.py)

Я думаю, что ошибка возникает из-за неправильного шаблона импорта. Что мне делать?

1 Ответ

2 голосов
/ 30 мая 2020

Для ForeignKey:

Вместо использования reporterprofile = models.ForeignKey(ReporterProfile, ...) вы можете использовать reporterprofile = models.ForeignKey("accounts.ReporterProfile", ...), поэтому вам не нужно импортировать модель.

Для предотвращения ошибки импорта циркуляра:

Вместо использования:

from accounts.models import ReporterProfile
[...]
foo = ReporterProfile()

Вы можете использовать:

import accounts.models
[...]
foo = accounts.models.ReporterProfile()
...