@artinnok
бекенд-программист

Какова правильная логика импорта модулей в таком случае?

Есть такие модели:
app1/models.py:
from django.db import models
from app2.models import B
from app3.models import C

class A(models.Model):
      pass


app2/models.py:
from django.db import models
from app1.models import A

class B(models.Model):
    data = models.ForeignKey(A)


app3/models.py:
from django.db import models

class C(models.Model):
    pass


app4/models.py:
from django.db import models
from app1.models import A

class D(models.Model):
    data = models.ForeignKey(models.Model)


Возникает циклический импорт модулей - как следствие, ошибка при миграции.

Какова должна быть правильная логика импорта данных модулей? Не просто же так импортировать, аргументируя тем, что так не работает. Должна быть определенная логика импорта, которая прослеживается в каждом приложении.

P.S. При этом, все приложения содержат только те модели, которые относятся к ним самим. База нормализована - нет повторяющихся полей.

P.P.S.
1) Вынести класс A в отдельный файл не вариант - потому что появляется отдельный файл, все модели должны хранится в одном месте.
2) Перенести инструкции импорта после объявления класса в app1 также не вариант - неправильно и некрасиво.
3) Инструкцию импорта в функцию не хочу выносить - некрасиво.
  • Вопрос задан
  • 299 просмотров
Пригласить эксперта
Ответы на вопрос 1
zymanch
@zymanch
python/django web-developer
столкнулся с этой проблемой не так давно. Теперь файлы моделей у меня выглядят так:
app2/models.py:
from django.db import models

class B(models.Model):
    data = models.ForeignKey('app1.A')

избавляет от лишних импортов и, ИМХО, делает код модели более читаемым - всегда видишь к какому приложению относится модель.
Если нужно в том же файле использовать класс A, например - в методе того же класса, то делаю так:
from django.db import models
from django.apps import apps

class B(models.Model):
    data = models.ForeignKey('app1.A')

    def some_method(self):
        a_class = apps.get_model('app1', 'A')
        a_object = a_class.objects.get(id=1)
        ...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы