我必须保存上传照片的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?
非常感谢任何帮助!感谢。
答案 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
,否则会一遍又一遍地递归添加相同的拇指。