4

継承された 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
4

2 に答える 2

4

残念ながら、それは Python クラスの仕組みではありません。クラス本体 (フィールド コンストラクターを含む) のコードは、クラスが定義されるときに評価されます。そのため、サブクラスが定義された時点で、フィールド コンストラクターは既に呼び出されており、それらの値はロックされています。

さらに、Django ORMはモデル フィールドのオーバーライドをサポートしていません。ImageKit フィールドは通常のモデル フィールドではありませんが、Django はこの機能をサポートしていないため、IK がサポートするものではありません。(私はメンテナーです。)

したがって、いくつかの重複に耐えるか、メタクラスの世界を掘り下げる必要があります。または、モデルに基づいて異なるスペック クラスを作成することもできます。

于 2013-06-21T22:31:21.560 に答える
0

これを基本クラス(ImageLink)に追加してみてください

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

そして電話するPosterLink.showDefaultValue()

特定のケースのすべてのデフォルトパラメーターの辞書を返す、これに似た関数を作成します。ただし、これで十分なスタートが切れるはずです。

于 2013-06-21T16:33:29.667 に答える