2012-06-10 43 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)提取元數據,而不僅僅是存儲在本地文件系統中的元數據,從而使代碼在部署中可移植性更高。