【问题标题】:Auto-filling other ImageFields based on the first one根据第一个自动填充其他 ImageField
【发布时间】:2014-12-28 01:01:46
【问题描述】:

我必须保存上传照片的 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?

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

【问题讨论】:

    标签: python django model django-models


    【解决方案1】:

    像这样从self.photo.file 中删除.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()
    

    【讨论】:

    • 它不起作用。它不会将照片保存到指定文件夹。
    • @4evertoblerone 检查我的编辑。将save(*args, **kwargs) 添加到super(Post, self).save() 的末尾
    • *args 和 **kwargs 不是用于定义类方法/函数而不是方法/函数调用吗?顺便说一句,它不起作用。:)
    • 我尝试将 *args 和 **kwargs 添加到我的另存为参数版本中,但它再次不起作用。
    • 在您的情况下,您似乎两次触摸数据库(创建 + 更新)并且您有一个冗余 IO 操作(读取保存的图像以保存/创建其他版本)。对我来说,这是不行的。有没有办法从 temp 获取照片。变量并一次保存整个 Post 对象?
    【解决方案2】:

    根据第一个填充其他 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 ,否则它将开始递归地一遍又一遍地添加相同的拇指。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2020-09-14
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2021-05-12
      相关资源
      最近更新 更多