2013-06-21 32 views
3

我想覆盖继承的Django模型中的一些默认值。对于我需要的模型,我有一堆不同的图像尺寸,并且所需的字段是90%。Django模型继承覆盖字段属性中使用的变量

我已经尝试创建一个基本模型来使用,并将要添加任何额外的字段需要的儿童模型。

我遇到的问题是图像仅使用我设置的“默认”值,并且未在子模型中被覆盖。我正试图完成什么?

谢谢!

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 

回答

4

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

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

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

+0

好的,谢谢你的解释 – mikes000

+0

Np。乐意效劳! – matthewwithanm

0

尝试添加这对你的基类(ImageLink的)

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

,然后调用PosterLink.showDefaultValue()

我想创建一个类似的函数返回的所有默认PARAMS的字典你的具体案例。这应该给你足够的启动。