Как правильно определить область видимости функции валидатора в родительском классе для использования в дочернем классе
Я пытаюсь использовать валидаторы, но у меня возникает загадочная проблема с использованием валидаторов в родительском/дочернем классе.
Прямо сейчас я создал базовый класс для всех медиа в моем проекте; все медиа в этой модели должны иметь имя и миниатюру:
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
определения.