@marselabdullin

Почему образуется круговая зависимость импортов django?

У меня выскакивает ошибка:
cannot import name 'Device' from partially initialized module 'cms.models' (most likely due to a circular import)

Я выяснил, что она связана с круговым импортом валидаторов:
from django.core.validators import MaxValueValidator, MinValueValidator
from .validators import UniversalMaxValidator, UniversalMinValidator

Пример использования этих валидаторов в модели:
height = models.FloatField(validators=[UniversalMinValidator(metric_min=50, inch_min=1.8).validate(), UniversalMaxValidator(metric_max=260, inch_max=8.7).validate()], verbose_name=_('height'),
                               help_text=None, default=0, error_messages={'required': _('Indicate your height')})
    weight = models.FloatField(validators=[MinValueValidator(20), MaxValueValidator(1330)], verbose_name=_('weight'),
                               help_text=None, default=0, error_messages={'required': _('Enter your weight')})


validators.py(из которого я импортирую кастомные валидаторы):
from django.core.exceptions import ValidationError
from django.core.validators import MaxValueValidator, MinValueValidator, BaseValidator
from django.utils.translation import gettext_lazy as _

from .views import HealthData


class UniversalMinValidator(BaseValidator):
    def __init__(self, metric_min, inch_min):
        self.metric_min = metric_min
        self.inch_min = inch_min
        self.measuring_system = self.request.user.health_data.measuring_system

    def validate(self):
        if self.measuring_system == 'Metric':
            return MinValueValidator(self.metric_min)
        else:
            return MinValueValidator(self.inch_min)


class UniversalMaxValidator(BaseValidator):
    def __init__(self, metric_max, inch_max):
        self.metric_min = metric_max
        self.inch_min = inch_max
        self.measuring_system = self.request.user.health_data.measuring_system

    def validate(self):
        if self.measuring_system == 'Metric':
            return MinValueValidator(self.metric_max)
        else:
            return MinValueValidator(self.inch_max)

Когда я убираю импорт кастомного валидатора все работает, но мне нужно использовать его чтоб валидатор преобразовывался в зависимости от выбранной системы исчисления
  • Вопрос задан
  • 2026 просмотров
Решения вопроса 1
@cython
Уберите 5 строку из validators.py. Получается так, что вы импортируете валидаторы во views, и views в валидаторы, хотя не понятно цель этого импорта.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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