4

我正在Item从 csv 文件创建下面显示的模型的一些实例。在 csv 文件中,仅指定了 Item 的 thename和 the 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)
4

2 回答 2

2

这就是你所需要的

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

image 字段采用文件名和字段定义的upload_to,并将其转换为图像资源。如果你传入一个图像资源,它会认为它正在制作一个新的。

所以这:

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

完全没有必要

charfield 和 image 字段之间的唯一区别是 imagefield 采用文件名并将其转换为 PIL Image 资源以进行进一步操作。它只是一个包装。

于 2012-07-09T17:40:35.773 回答
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 将被弄乱。

于 2012-07-19T22:40:49.603 回答