具有动态属性的Django模型

时间:2011-10-18 02:14:37

标签: python django django-models

我完全是一个全新的编程,所以请原谅可能是一个愚蠢的问题,但过去几天我一直在为此而努力。

我有两个模型,照片和缩略图。我试图想出一个简单,动态的方法来获取每张照片的缩略图链接。我提出了一个执行此操作的函数(get_thumbs),但是我希望它在调用模型时自动运行(基本上这样一旦模型可用,我就会得到Photo.get_%s_url%thumb.name)

以下是我的models.py。任何帮助或推动正确的方向(即使只是“google blah”)将不胜感激。感谢。

class Photo(models.Model):
    name = models.CharField(max_length=100)
    original_image = models.ImageField(upload_to='photos')
    caption = models.TextField(null=True, blank=True)
    title_slug = models.SlugField(null=True, blank=True, unique=True)
    rootfilename = models.CharField(max_length=50, editable=False, blank=True)
    num_views = models.PositiveIntegerField(editable=False, default=0)

    def __unicode__(self):
        return self.name

    thumbnails = Thumbnail.objects.all()

    def create_thumbs(self):
        for thumbnail in self.thumbnails:
            fname = (settings.MEDIA_ROOT + self.rootfilename + '_' + thumbnail.name + '.jpg')
            if exists(fname):
                None
            else:
                t_img = Image.open(self.original_image.path)
                t_fit = ImageOps.fit(t_img, (thumbnail.height,thumbnail.width), Image.ANTIALIAS, 0, (0.5,0.5))
                t_fit.save(fname,"JPEG")

    def save(self, *args, **kwargs):
        self.rootfilename = (self.original_image.name).strip('photos/.jpg')
        super(Photo, self).save(*args, **kwargs)
        self.create_thumbs()

    def get_thumbs(self):
        for thumb in self.thumbnails:
            setattr(self, ('get_'+thumb.name+'_url'), ('thumbs/'+self.rootfilename+'_'+thumb.name+'.jpg'))

1 个答案:

答案 0 :(得分:1)

您想要像使用save方法一样覆盖__init__方法,并在调用super之前调用self.get_thumbs()(Photo,self)。 init (* args ,** kwargs)

或者,您可以查看其他人解决此问题的方法sorl.thumbnail,django-imagekit或easy-Thumbnails(有点像两者的组合)