Skip to main content
 首页 » 编程设计

python之具有动态属性的 Django 模型

2025年05月04日24jillzhang

我对编程完全是个新手,所以请原谅这个可能很愚蠢的问题,但在过去的几天里我一直在为这个问题绞尽脑汁。

我有两个模型,照片和缩略图。我正在尝试想出一种简单、动态的方法来获取每张照片的缩略图链接。我想出了一个执行此操作的函数 (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')) 

请您参考如下方法:

您想像使用 save 方法一样覆盖 __init__ 方法,并在调用 super(Photo, self) 之前调用 self.get_thumbs()。< strong>初始化(*args, **kwargs)

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