9

プロジェクト内のあるモデルから別のモデルに画像をコピーしたいと考えています。これらが私のモデルであるとします:

class BackgroundImage(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)


class ProfilePicture(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

    @classmethod
        def create_from_bg(cls, bg_img):
            img = cls(user=bg_img.user, image=bg_img.image, caption=bg_img.caption+'_copy', pub_date=bg_img.pub_date)
            img.save()
            return img

今のところ、私はこれらを行うことができます:

ユーザーを取得するには

>>>m = User.objects.get(username='m')

ユーザーのプロフィール画像セットを取得するには

>>>m_pro_set = m.profilepicture_set.all()
>>>m_pro_set
[<ProfilePicture: pro_mik>]

ユーザーの背景画像から画像オブジェクトを取得する

>>>m_back_1 = m.backgroundimage_set.get(id=2)
>>>m_back_1
<BackgroundImage: bg_mik>

その後:

>>>profile_pic = ProfilePicture.create_from_bg(m_back_1)

チェックすると、新しいインスタンスが作成されます。

>>>m_pro_set
[<ProfilePicture: pro_mik>,<ProfilePicture: bg_mik>]

しかし、パスを確認すると、メディア フォルダーでさえ、同じ画像であり、画像ファイルの実際のコピーではありません。

>>>profile_pic.image
<ImageFileField: uploaded_files/1389904144_ken.jpg>
>>>m_back_1.image
<ImageFileField: uploaded_files/1389904144_ken.jpg>

fileモデル内の元の画像を実際にコピーするにはどうすればよいですか? どんな助けでも大歓迎です!ありがとうございました。

4

2 に答える 2

15

だから私はこの質問がかなり古いことを知っていますが、うまくいけばこの答えは誰かを助けます...

これを行うための私のアプローチ、提案されたモデルの適切なパスに写真をアップロードする方法は次のとおりです。

from django.core.files.base import ContentFile

picture_copy = ContentFile(original_instance.image.read())
new_picture_name = original_instance.image.name.split("/")[-1]
new_instance.image.save(new_picture_name, picture_copy)

私の場合、新しい名前は同じファイル名ですが、新しいモデルの画像フィールドのパスで更新されることを確認してください。あなたの場合、「get_upload_file_name」の内容によっては、同じパスに再びつながる可能性があります(両方のクラスで使用されているため)。また、新しいランダムな名前を作成することもできます。

これが誰かに役立つことを願っています=)

于 2016-06-16T18:58:13.730 に答える