Наследование модели 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()
Я бы создал функцию, похожую на эту, которая возвращала бы словарь всех параметров по умолчанию для вашего конкретного случая. Это должно дать вам достаточно начала, хотя.