django - 如何将实际图像文件从一个模型复制到另一个模型?

Posted

技术标签:

【中文标题】django - 如何将实际图像文件从一个模型复制到另一个模型?【英文标题】:django - How to copy actual image file from one model to another? 【发布时间】:2013-11-20 17:37:23 【问题描述】:

我想在项目中将图像从一个模型复制到另一个模型。假设这些是我的模型:

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?任何帮助都感激不尽!谢谢。

【问题讨论】:

这里根本不清楚你在问什么。该图像只是磁盘上的一个文件,与任何特定模型无关。保持不变有什么问题? 实际上,当我保存图像的新实例时,它会创建同一图像的新实例,而不是在磁盘中创建新文件,即没有实际复制文件。对不起,我没有明确我的问题。 :) 【参考方案1】:

所以我知道这个问题已经很老了,但希望这个答案对某人有所帮助......

我这样做的方法是:将照片上传到建议模型的正确路径:

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”中的内容,它可能会再次导致相同的路径(因为在两个类中都使用了)。您还可以创建一个新的随机名称。

希望这对某人有帮助 =)

【讨论】:

正确答案:)【参考方案2】: 最佳和简短的解决方案是
existing_instance = YourModel.objects.get(pk=1)
new_instance.image = existing_instance.image

这对我来说很好。

【讨论】:

以上是关于django - 如何将实际图像文件从一个模型复制到另一个模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 css django 1.11.x 中的模型设置图像?

如何使用 ImageField 模型调整使用 Django 上传的图像文件的大小? [关闭]

如何使用ImageField模型调整使用Django上传的图像文件的大小? [关闭]

如何保存具有多个图像的 django 模型?

Django:从服务器上的现有文件手动创建模型中的图像字段

如何将 MATLAB libsvm 模型复制到 android 应用程序文件夹