2012-06-10 40 views
4

,我最近一直experiementing与使用Djangodjango在模型定制保存中访问上传的文件,最佳实践?

我希望能够通过对模型的保存功能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

使用Django的pre_save信号(docs,也看到Signals Django的文档中):

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

0

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

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

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