2012-07-09 80 views
4

我從csv文件創建瞭如下所示Item模型的一些實例。在csv文件中,只指定了項目的namefilename。該image場由如果圖像存在尋找設置,如果確實如此,將圖像文件設置爲image以編程方式保存ImageField複製圖像文件

我做的:

item = Item() 
item.name = csv_fields[0] 
item.filename = csv_fields[1] 
item.save() 

... 

f = open(settings.MEDIA_ROOT+"images/"+item.filename, 'r') 
item.image = File(f) 
item.save() 

這樣,圖像在settings.MEDIA_ROOT+"images/"複製爲<original filename>_1。如何避免這種情況?即如何才能將現有文件設置到圖像字段而不復制它?

class Item(models.Model): 

    name = models.CharField(max_length=50) 
    filename = models.CharField(max_length=100,) 
    image = models.ImageField(upload_to='images', blank=True, null=True) 

回答

2

這是你所需要的

item = Item() 
item.name = csv_fields[0] 
item.filename = csv_fields[1] 
item.image = csv_fields[1] 
item.save() 

像場需要一個文件名和字段定義的upload_to,並將其轉換爲圖像資源。如果你傳遞一個圖像資源,它認爲它將創建一個新的。

所以這個:

f = open(settings.MEDIA_ROOT+"images/"+item.filename, 'r') 
item.image = File(f) 

是沒有必要的

一個charfield和像場之間唯一的差異是,ImageField的需要的文件名和其強制轉換爲PIL圖片資源,進一步操縱。它只是一個包裝。

1

Francis Yaconiello答案是正確的,但我有一個澄清細節。

item.image = csv_fields[1] 

注意,這應該是相對於所述介質根或其它存儲根目錄的路徑。例如,settings.MEDIA_ROOT = '/home/myuser/media'ImageField(upload_to='images')

因此,如果手動保存在`/home/myuser/media/images/purty.jpg」上的圖像,然後csv_fields [1]應該是:

item.image = '/images/purty.jpg' 

其他明智的,item.image.name ,item.image.path和item.image.url將會混亂。