В Django, почему я не могу импортировать модель в файл python, созданный мной внутри того же приложения?

Я создал в Django, в моем приложении файл python для forms и я хочу импортировать модель из .models (из того же приложения). Проблема в том, что когда я импортирую модель, она возвращает ошибку.

Модель is(models.py):

class Article(models.Model):
    title = models.CharField(max_length=100)
    location=models.CharField(max_length=120,null=True,blank=True)
    category=models.CharField(max_length=100,null=True,blank=False)
    slug=models.SlugField(null=True, blank=True, unique=True)
    boddy=models.TextField()
    timestamp = datetime.now()
    update = models.TimeField(auto_now=True)

Проблема в util.py (файл python, который я создал) :

from .models import Article

Ошибка:

ImportError: cannot import name 'Article' from partially initialized module 'hello.models' (скорее всего, из-за циклического импорта) (D:\Python\Django\Projects\myproject\hello\models.py)

Файлы python находятся в одном приложении

Похоже, вы пытаетесь сделать то, что называется "Круговой импорт"; вы не можете этого сделать.

Ваше приложение разделено на модули и пакеты. (.py файлы и папки с __init__.py файлом внутри), и когда вы импортируете модуль в другой модуль, python запустит весь этот модуль и установит его в память.

Если в models.py вы запускаете

from ./.. import utils

... и в utils.py

from .models import Article

Вы закончите импортированием модуля в другой, затем в другой рекурсивно, что приведет к переполнению памяти.

Чтобы этого не произошло, Django поставляется с несколькими проверками, которые предотвращают этот циркулярный импорт.

Хороший способ предотвратить это - разделить ваши классы на более мелкие модули, чтобы вы импортировали только этот модуль. С другой стороны, если вам нужно ссылаться на внешние ключи, вы можете использовать встроенную в Django Lazy Reference, используя '<app_name>.<ClassName>' под кавычками.

Поступая таким образом, вам не придется импортировать модуль, следовательно, нет риска циркулярного импорта.

Вернуться на верх