Как определить django-imagekit ImageSpecFields в классе parent/mixin?

Я использую django-imagekit, чтобы предоставлять уменьшенные версии загруженных изображений на моих моделях Django.

Я хотел бы определить различные миниатюры ImageSpecField в миксине, которые затем могут наследовать мои модели. Однако каждая модель в настоящее время имеет другое имя для ImageField, на котором будут основаны ее ImageSpecField.

Я пробовал это:

from django.db import models
from imagekit.models import ImageSpecField
from imagekit.processors import ResizeToFit

class ThumbnailModelMixin(models.Model):
    IMAGE_SPEC_SOURCE_FIELD = None

    list_thumbnail = ImageSpecField(
        source=IMAGE_SPEC_SOURCE_FIELD,
        processors=[ResizeToFit((80, 160)],
        format="JPEG",
        options={"quality": 80}
    )

    class Meta:
        abstract = True

class Book(ThumbnailModelMixin):
    IMAGE_SPEC_SOURCE_FIELD = "cover"
    cover = models.ImageField(upload_to="books/")

class Event(ThumbnailModelMixin):
    IMAGE_SPEC_SOURCE_FIELD = "ticket"
    ticket = models.ImageField(upload_to="events/")

Но это не удается при загрузке страницы:

AttributeError: объект «Книга» не имеет атрибута «list_thumbnail»

Есть ли способ заставить такое наследование работать?

Есть как минимум два других решения:

  1. Не используйте миксин/родитель и включайте ImageSpecField в каждый дочерний класс - много повторяющегося кода.
  2. Измените поля Book.cover и Event.ticket, чтобы они имели одинаковое имя, например image, и используйте "image" для параметра ImageSpecField source.

Последнее звучит лучше всего, но мне все еще любопытно, есть ли способ заставить работать наследование?


person Phil Gyford    schedule 06.04.2020    source источник
comment
В итоге я сделал решение (2), изменив поле изображения модели на thumbnail. Я все еще хотел бы знать, возможно ли заставить его работать иначе.   -  person Phil Gyford    schedule 07.04.2020
comment
И я подозреваю, что это просто невозможно, судя по этому похожему ответу, который я наконец нашел stackoverflow.com/a/17245249/250962< /а>   -  person Phil Gyford    schedule 07.04.2020