Django模型继承覆盖字段属性中使用的变量

时间:2013-06-21 16:07:17

标签: python django django-imagekit

我试图覆盖继承的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 个答案:

答案 0 :(得分:4)

不幸的是,这不是Python类的工作方式。定义类时,将评估类主体中的代码(包括字段构造函数)。因此,在定义子类时,已经调用了字段构造函数,并且这些值被锁定。

另外,Django ORM doesn't support overriding model fields。 ImageKit字段不是常规模型字段,但由于Django无论如何都不支持此功能,因此它不是IK支持的。 (我是维护者。)

因此,你要么必须忍受一些重复,要么深入研究元类世界。或者,您可以create a spec class that varies based on the model

答案 1 :(得分:0)

尝试将此添加到您的基类(ImageLink)

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

然后拨打PosterLink.showDefaultValue()

我会创建一个类似于此的函数,它返回一个包含特定情况的所有默认参数的字典。这应该给你足够的开始。