Я лечу циклические импорты выделением в отдельный модуль объектов, которые нужны "всем" и оттуда их портирую. Зачастую это можно сделать, но иногда приходится долго прыгать по файлам, выясняя кто кого когда портировал.
Еще способ избегания циклов - портировать "по месту", например прямо в теле функции, юзающей библу. Минусы - импорты раскиданы по коду и сложно сделать рефактор при изменении модуля, который портируется. На производительность это не влияет (ну или минимально влияет), так как реальный импорт-парсинг происходит только при первом выполнении оператора import, а далее юзается .pyc файл.
Кстати в Django можно юзать строку названия модели вместо самой модели, например:
class GoalReach(MyAbstractModel, TestFactoryBoy):
....
visit = ForeignKey('Visit', null=True, blank=True, related_name='goal_reached', on_delete=CASCADE)
.....
Visit - это модель из другого модуля, она записана как 'Visit' (в кавычках) при старте django её находит через installedapps