4

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

2 回答 2

0

如果您使用图像库函数来收集图像元数据,那就更好了。然后你只需要从FileStorage图像字段的实例中读取图像数据。只需检查文件上传的文档。此外,当使用 Django 时ImageField,它会检查上传的文件以查看是否是有效的图像文件,检查代码ImageField作为基线以获得有关图像的更多信息。

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

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

于 2012-06-11T21:44:19.390 回答
-1

使用 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 现在将do_something在保存MyModel对象之前调用。

于 2012-06-10T15:26:21.860 回答