具有动态属性的Django模型

2 投票
1 回答
1414 浏览
提问于 2025-04-17 04:31

我完全是编程新手,所以请原谅我可能问了个傻问题,但我这几天一直在为这个问题苦恼。

我有两个模型,一个是照片(Photos),另一个是缩略图(Thumbnails)。我想找一个简单又灵活的方法来获取每张照片的缩略图链接。我写了一个函数(get_thumbs)来实现这个功能,但我希望它能在模型被调用时自动运行(也就是说,当模型可用时,我希望能立即得到 Photo.get_%s_url % thumb.name)。

下面是我的 models.py 文件。任何帮助或者指点(即使只是“去谷歌搜索一下”)都将非常感激。谢谢。

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 个回答

1

你想像处理保存方法一样,重写一下 __init__ 方法,并且在调用 super(Photo, self).init(*args, **kwargs) 之前,先调用 self.get_thumbs()

另外,你也可以看看其他人是怎么解决这个问题的,比如 sorl.thumbnail、django-imagekit 或者 easy-thumbnails(这其实是前两者的结合)。

撰写回答