Django继承 - 访问子类字段

时间:2017-10-26 16:23:47

标签: django inheritance

我有以下Django模型:

class Image(TimeStamp):
     hash = models.CharField(max_length=33,
                            unique=True,
                            editable=False)

     filesize = models.PositiveIntegerField(blank=True,
                                           null=True,
                                           editable=False)

class Image1(Image):
    image = models.ImageField(upload_to='image1/')

class Image2(Image):
    image = models.ImageField(upload_to='image2/')

我希望能够在创建图像时自动计算文件大小和散列,并且在超类中我认为最合理的位置。但是,我需要能够从超类访问子类图像字段,以便计算散列和文件大小。有没有办法实现这个目标?

我将这个保存方法添加到超类中,但当然它并不了解图像:

def save(self, *args, **kwargs):
    super(Image, self).save(*args, **kwargs)

    self.hash = hashlib.md5(self.image.read()).hexdigest()
    self.filesize = self.image.size

1 个答案:

答案 0 :(得分:1)

这是我最终要解决的问题。感谢大家的反馈意见,请告诉我这段代码是否可以进一步改进:

def get_image_directory(instance, filename):
    return os.path.join(instance.upload_to, filename)


class Image(TimeStamp):
    hash = models.CharField(max_length=33,
                            unique=True,
                            editable=False)

    file_size = models.PositiveIntegerField(blank=True,
                                           null=True,
                                           editable=False)

    image = models.ImageField(upload_to=get_image_directory)

    def __str__(self):
        return self.image.url.split('?')[0]

    def save(self, *args, **kwargs):
        self.hash = hashlib.md5(self.image.read()).hexdigest()
        self.file_size = self.image.size
        super(Image, self).save(*args, **kwargs)

    class Meta:
        abstract = True


class Image1(Image):
    upload_to = 'image1/'

class Image2(Image):
    upload_to = 'image2/'