我正在从csv文件创建下面显示的Item
模型的一些实例。在csv文件中,仅指定了项目的name
和filename
。通过查看图像是否存在来设置image
字段,如果存在,则将图像文件设置为image
:
我做:
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)
答案 0 :(得分: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和image字段之间唯一的差异是imagefield获取文件名并将其转换为PIL Image资源以进行进一步操作。它只是一个包装。
答案 1 :(得分: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将搞砸。