Как правильно определить область видимости функции валидатора в родительском классе для использования в дочернем классе

Я пытаюсь использовать валидаторы, но у меня возникает загадочная проблема с использованием валидаторов в родительском/дочернем классе.

Прямо сейчас я создал базовый класс для всех медиа в моем проекте; все медиа в этой модели должны иметь имя и миниатюру:

class BaseMedia(BaseModel):
    def validate_thumbnail(image_obj):
        validate_image_file_extension(image_obj)
        dimensions = [image_obj.width, image_obj.height]
        if dimensions[0] != 400 or dimensions[1] != 400:
            raise ValidationError(
                "Thumbnail dimensions must be 400 x 400; uploaded image is %s x %s"
                % (dimensions[0], dimensions[1])
            )

    media_title = models.CharField(
        max_length=25, verbose_name="Title (25 char)", null=True
    )
    thumbnail = models.ImageField(
        null=True,
        verbose_name="Thumbnail (400 x 400 px)",
        upload_to="microscopy/images/thumbnails",
        validators=([validate_thumbnail],),
    )

и затем у меня есть дочерний класс, который наследует и реализует ядро медиа; например:

class MicroscopyMedia(BaseMedia):
    def validate_image(image_obj):
        validate_image_file_extension(image_obj)
        dimensions = [image_obj.width, image_obj.height]
        if dimensions[0] != 1920 or dimensions[1] != 1070:
            raise ValidationError(
                "Image dimensions must be 1920 x 1070; uploaded image is %s x %s"
                % (dimensions[0], dimensions[1])
            )

    media = models.ImageField(
        null=True,
        verbose_name="Media (1920 x 1070 px)",
        blank=True,
        upload_to="microscopy/images",
        validators=[validate_image],
    )

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

Однако, когда я пытаюсь выполнить эту миграцию, я получаю ошибку:

(env) PS D:\Projects\django-cms\projects\cms> python .\manage.py makemigrations
SystemCheckError: System check identified some issues:

ERRORS:
microscopy.BaseMedia.thumbnail: (fields.E008) All 'validators' must be callable.
        HINT: validators[0] ([<function BaseMedia.validate_thumbnail at 0x000001D3193C8A60>]) isn't a function or instance of a validator class.

Похоже, что здесь возникает проблема масштабирования. Как определено, validate_thumbnail() является обычной функцией в области видимости BaseMedia и недоступна для MicroscopyMedia. Однако я не могу сделать ее и функцией-членом, поскольку не могу передать параметр self.

Как определить функцию валидатора в родительском классе, чтобы, когда дочерний класс вызовет ее, это был корректный вызов функции?

Структурируйте свой код таким образом:

def validate_thumbnail(image_obj):
    validate_image_file_extension(image_obj)
    ...

class BaseMedia(BaseModel):
    ...
    thumbnail = models.ImageField(
        ...
        validators=([validate_thumbnail],),
    )

Аналогично, продвигайте def validate_image(): так, чтобы он находился в области видимости модуля, а не погребен внутри class определения.

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