#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: да, обновил ответ. Спасибо!