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

Posted

技术标签:

【中文标题】django 在模型自定义保存中访问上传的文件,最佳实践?【英文标题】:django accessing uploaded files in model custom save, best practice? 【发布时间】:2012-06-13 17:51:33 【问题描述】:

我最近一直在尝试使用 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()

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

使用 Django 的 pre_save 信号(docs,另请参阅 Django 文档中的 Signals):

from django.db.models.signals import pre_save
from myapp.models import MyModel

def do_something(sender, **kwargs):
    pass
pre_save.connect(do_something, sender=MyModel)

Django 现在将在保存MyModel 对象之前调用do_something

【讨论】:

以上是关于django 在模型自定义保存中访问上传的文件,最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

如何在用户导航期间在 Django 中保存自定义用户模型

保存自定义用户模型时 Django ManyToMany 覆盖

Django(十九)文件上传:图片上传(后台上传自定义上传)

将通过 ajax 上传的文件保存到 Django 模型 ImageField

django模型中的自定义保存方法

Django 管理员在模型保存期间返回自定义错误消息