Наследование модели Django, перекрывающее переменную, используемую в атрибуте поля

Я пытаюсь переопределить некоторые значения по умолчанию в унаследованной модели Django. У меня есть куча разных размеров изображений для нужных мне моделей, и необходимые поля на 90% одинаковы.

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

У меня проблема в том, что изображения используют только значения "по умолчанию", которые я установил, и не перезаписываются в дочерней модели. Возможно ли то, что я пытаюсь достичь?

Спасибо!

class ImageLink(models.Model):

    #Default Image Sizes
    SIZED_WIDTH =  500
    SIZED_HEIGHT = 400

    THUMB_WIDTH = 50
    THUMB_HEIGHT = 50


    #Name of the link
    name = models.CharField(max_length = 15)

    #Images used for link
    image_original = models.ImageField(upload_to="imageLink/images/%Y/%m/%d")

    image_sized = ImageSpecField(   source='image_original',
                                processors=[ResizeToFill(SIZED_WIDTH, SIZED_HEIGHT)],
                                format='JPEG',
                                options={'quality' : 60 })

    image_thumb = ImageSpecField(   source='image_original',
                                processors=[ResizeToFill(THUMB_WIDTH, THUMB_HEIGHT)],
                                format='JPEG',
                                options={'quality' : 60 })
    class Meta:
        abstract = True

# Model for all poster links
class PosterLink(ImageLink):

    #Image sizes
    SIZED_WIDTH =  200
    SIZED_HEIGHT = 263

    THUMB_WIDTH = 50
    THUMB_HEIGHT = 66

2 ответа

Решение

К сожалению, это не так, как работают классы Python. Код в теле класса (включая конструкторы полей) оценивается при определении класса. Таким образом, в тот момент, когда подкласс определен, конструкторы полей уже были вызваны, и эти значения заблокированы.

Кроме того, Django ORM не поддерживает переопределение полей модели. Поля ImageKit не являются обычными полями модели, но, поскольку Django все равно не поддерживает эту функцию, IK ее не поддерживает. (Я сопровождающий.)

Таким образом, вам либо придется жить с некоторым дублированием, либо копаться в мире метаклассов. Кроме того, вы можете создать класс спецификации, который зависит от модели.

Попробуйте добавить это в ваш базовый класс (ImageLink)

@classmethod
def showDefaultValue(cls)
print 'default value = %s' % (cls.default)

а затем позвоните PosterLink.showDefaultValue()

Я бы создал функцию, похожую на эту, которая возвращала бы словарь всех параметров по умолчанию для вашего конкретного случая. Это должно дать вам достаточно начала, хотя.

Другие вопросы по тегам