2012-07-09 37 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将会混乱。

相关问题