ImportError: не удается импортировать имя «Maca» из частично инициализированного модуля «maca.models» (скорее всего, из-за циклического импорта)

#python #django #web

Вопрос:

У меня есть эта ошибка ImportError: cannot import name 'Maca' from partially initialized module 'maca.models' (most likely due to a circular import) .

У меня есть такой код

 from maca.models import Maca
class Maca2(models.Model)
   maca = models.ForeignKey(
     Maca, on_delete=models.CASCADE
)
 

Теперь, чтобы смоделировать «Maca», я пытаюсь получить доступ ко всем объектам «Maca2», подобным этому

 from maca2.models import Maca2
class Maca(models.Model)
  ...


@property
maca_has_maca2(self)
  maca2 = Maca2.objects.filter(maca=self.id)
 

Можете ли вы помочь мне справиться с этим?

Комментарии:

1. Вы можете использовать обратную связь для доступа к связанным экземплярам из внешнего ключа, вам не нужно импортировать модель: maca2 = self.maka2_set.all() . docs.djangoproject.com/en/3.2/topics/db/queries/…

Ответ №1:

Вы можете импортировать Maca2 в maca_has_maca2 свойство:

 # no import of maca2.models

class Maca(models.Model):
    # …

    @property
    def maca_has_maca2(self):
        from maca2.models import Maca2
         maca2 = Maca2.objects.all() 

Для ForeignKey s, OneToOneField s и ManyToManyField s вы можете использовать строковый литерал со структурой as 'app_name.ModelName' для ссылки на модель, например:

 # no import of maca2.models

class Maca(models.Model):
    maca2 = models.ForeignKey(
        'maca2.Maca2', on_delete=models.CASCADE
    ) 

Это позволяет избежать импорта модулей и, следовательно, циклического импорта. Если модель имеет то же app_name самое , вы можете сослаться на это 'ModelName' .

Комментарии:

1. Вероятно, следует также отметить, что ForeignKey s может использовать строковые ссылки на метки моделей.

2. @AKX: да, обновил ответ. Спасибо!