4

以下に示すモデルのいくつかのインスタンスをItemcsvファイルから作成しています。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)
4

2 に答える 2

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の唯一の違いは、imagefieldがファイル名を取得し、それをPILImageリソースにキャストしてさらに操作できることです。その単なるラッパー。

于 2012-07-09T17:40:35.773 に答える
1

Francis Yaconielloの答えは正しいですが、明確な詳細が1つあります。

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 に答える