基于第一个自动填充其他ImageField

时间:2014-10-31 16:25:28

标签: python django model django-models

我必须保存上传照片的3个版本(原始的一个和两个调整大小),我不想使用solr。 这两张额外的照片必须在我的模型中表示为ImageFields,所以我可以使用Django ORM。

class Post(models.Model):

    #...
    photo = models.ImageField(upload_to="photo_album")
    medium_photo = models.ImageField(upload_to="photo_album/medium", null=True)
    thumbnail = models.ImageField(upload_to="photo_album/thumbnails", null=True)

我尝试覆盖save()方法(这种情况下的照片大小相同):

    def save(self):

        self.thumbnail.file = self.photo.file
        self.medium_photo.file = self.photo.file
        super(Post, self).save()

但它不起作用(为什么?)。

如何在保存之前在我的模型中自动填充这些额外的ImageField?

非常感谢任何帮助!感谢。

2 个答案:

答案 0 :(得分:1)

.file移除self.photo.file,如下所示:

from PIL import Image
import StringIO

def save(self):
    iamge_file = StringIO.StringIO(self.photo.read())
    image = Image.open(image_file)
    self.thumbnail.file = image
    self.medium_photo.file = image
    super(Post, self).save()

答案 1 :(得分:1)

基于第一个填充其他ImageField的正确方法(根据我的情况创建和保存基于原始照片的缩略图)。

from PIL import Image
from django.core.files.base import ContentFile
import StringIO

class Post(models.Model):

    #...

    def save(self):

        thumb = Image.open(self.photo.file)
        thumb_io = StringIO.StringIO()
        thumb.save(thumb_io,format = thumb.format)
        self.thumbnail.save(self.photo.name, ContentFile(thumb_io.getvalue()), save=False)
        super(Post, self).save()

不要忘记将save设置为False,否则会一遍又一遍地递归添加相同的拇指。