python - django 在模型自定义保存中访问上传的文件,最佳实践?

标签 python django models filefield imagefield

我最近一直在尝试使用 django

我希望能够在模型保存功能上通过 imagemagick 运行上传的文件,我意识到这是不可能的,因为在保存实例之前文件不可用

如果在开始时调用保存,然后允许访问上传的文件,然后在其填充其他字段后重新保存,我就可以正常工作了

有没有更好的方法来实现这一点?调用保存函数两次感觉有点不对

class uploadedFiles(models.Model):
orignal_image = models.FileField(upload_to='userimages/')
user = models.ForeignKey(User)
description = models.TextField(blank=True)


def __unicode__(self,force_insert=False, force_update=False):
    return "%s uploaded by %s" % (self.orignal_image.path, self.user) 

def save(self, force_insert=False, force_update=False):
    super(uploadedFiles, self).save()
    s = ''
    cmd = subprocess.Popen(['identify', '-verbose', self.orignal_image.path], stdout=subprocess.PIPE)
    for line in cmd.stdout:
        s += line
    self.description = s
    super(uploadedFiles, self).save()

最佳答案

最好使用图像库函数来收集图像元数据。然后,您只需从 image 字段的 FileStorage 实例中读取图像数据。只需检查 documentation of file uploads .此外,当使用 Django 的 ImageField 时,它会检查上传的文件以查看是否是有效的图像文件,检查 ImageField 的代码作为基线以获取有关图像的更多信息.

我会为模型定义一个clean 方法,它会在调用模型的save 方法之前被调用。在 clean 中,然后使用 PIL 函数检查图像字段的数据流以获取元数据(或者您要为此使用的任何库,只要它接受数据流,不是物理文件),然后用元数据填充描述字段。

使用 Django 的存储 API 更好,因此您可以从存储在云(如 Amazon S3)中的文件中提取元数据,而不仅仅是那些存储在本地文件系统中的文件,从而使代码在部署之间更具可移植性。

关于python - django 在模型自定义保存中访问上传的文件,最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10969703/

相关文章:

python - Django-rest-framework中的可写嵌套序列化器?

python - Rest框架如何创建可选的嵌套对象?

django - 在 Django 中扩展 South Introspection

python - Django 表单 ForeignKey 数据库字段不是下拉列表

python - python中的PATH环境变量

python - Pyramid:用于自定义记录器和外部授权系统的 Tween 或 WSGI 中间件?

Django 根据模型本身的时间间隔获取模型对象

django - model_to_dict 没有返回带有 auto_now_add = True 的 DateTimeField

ruby-on-rails - 删除模型和表,以便可以在 Rails 中重新开始

python - 在 Django 中提供媒体服务