Django Storages S3获取每个查询中的所有图像

lfapxunr  于 12个月前  发布在  Go
关注(0)|答案(2)|浏览(138)

我设置我的项目使用亚马逊S3使用django-storages与S3 Boto后端.我的模型的一些有ImageFields上传到S3,它的工作正常.
当我尝试使用all()或filter()执行QuerySet时,问题就出现了。对于每个请求,包括django-admin请求,django都会从服务器获取查询集中的每个图像。
我做的唯一更改是将width_fieldheight_field添加到ImageField以保存高度和宽度,这样我就不必从S3检索图像来获取此信息。
这将是非常有帮助的,如果任何人有任何想法,为什么会发生这种情况或做什么来调试这个.我一直在寻找周围的代码S3 Boto和我不知道要检查什么.

lokaqttq

lokaqttq1#

这些对图像文件的访问可能来自django.db.models.fields.files.ImageField.update_dimension_fields
它的描述是这样的:

"""
Updates field's width and height fields, if defined.

This method is hooked up to model's post_init signal to update
dimensions after instantiating a model instance.  However, dimensions
won't be updated if the dimensions fields are already populated.  This
avoids unnecessary recalculation when loading an object from the
database.

Dimensions can be forced to update with force=True, which is how
ImageFileDescriptor.__set__ calls this method.
"""

字符串
在你的情况下,我会做的是扮演我们自己的width_field和height_field,并在图像上传时只更新一次。下面是我如何实现它(尚未在S3的生产环境中测试,但可以使用本地存储):

class ImageCovered(models.Model):
    def __init__(self, *args, **kwargs):
        # read and store original image data
        super(ImageCovered, self).__init__(*args, **kwargs)
        self.__original_cover_image = self.cover_image

    cover_image = models.ImageField(upload_to=get_upload_path, max_length=200, null=True, blank=True,)
    # We should not use ImageField's width_field nor height_field here, since it might call S3 files.
    # Instead, we implement our own fields and update it once only upon image saving.
    cover_image_height = models.PositiveSmallIntegerField(default=0)
    cover_image_width = models.PositiveSmallIntegerField(default=0)

    def save(self):
        super(ImageCovered, self).save()
        # Check if cover_image has been changed
        if self.__original_cover_image != self.cover_image :
            self.cover_image_height = self.cover_image.height
            self.cover_image_width = self.cover_image.width
            self.__original_cover_image = self.cover_image #replace original data
            super(ImageCovered, self).save(update_fields=('cover_image_height', 'cover_image_width',))

mzmfm0qo

mzmfm0qo2#

唯一的变化,我做的是增加了width_field和height_field的ImageField保存的高度和宽度,所以我没有检索图像从S3得到这个信息。
晚了10年,但对于在此更改之前上传的任何文件,您可能需要在所有对象上调用相关模型的保存()方法来填充字段。

相关问题