Django ImageField:直接使用磁盘中的文件

Django ImageField: directly using file from disk

我的磁盘上有一个文件,说:

/home/user/file.png

我有一个带有 StdImageField 的模型(类似于 ImageField,只是一些额外的选项),more here

models.py:

class MyModel(models.Model):
    image = StdImageField(upload_to="images", variations={"thumbnail": (600,400), "normal": (1000, 600)}, blank=True, null=True)

我想做的是以编程方式“上传”这张图片。我 而不是 只是想将现有路径分配给该字段,因为我希望图像存储在正确的文件夹中并适当调整大小。

所以假设我在变量 obj 中有一个模型实例,然后我尝试执行以下操作:

from django.core.files.images import ImageFile
open_file = open("/home/user/file.png", "rb")
django_file = ImageFile(open_file)
obj.image = django_file
obj.save()

乍一看效果很好,因为 a) 我的图像被移动到我的媒体根目录中的正确文件夹 images,并且 b) 图像被正确调整大小。但是,在此操作之后,带有文件路径的数据库字段变为绝对路径,包含媒体根目录的完整路径:

/src/media/images/file.png

但这不是它通常的工作方式 -- 这应该是相对的并且只包含:

images/file.png

为什么会变成绝对域,如何解决?

使用uploadedfile--(Django doc)class作为

<b>from django.core.files.uploadedfile import UploadedFile</b>

instance = MyModel(
    image=<b>UploadedFile(
        file=open("/home/user/path/to/file/foo.jpg", 'rb')
    )</b>
)
instance.save()

结果