gpt4 book ai didi

python - 获取在 django 中使用 "upload_to"的上传媒体文件的路径

转载 作者:行者123 更新时间:2023-12-01 00:09:54 24 4
gpt4 key购买 nike

我正在尝试替换将在我的模型中为某个 ImageField 上传的图像。现在我的模型是这样的:

class Image(models.Model):
image = models.ImageField(upload_to='images/')

def save(self, *args, **kwargs):
# some resizing here which works fine

如您所见,我的模型将文件保存到 'images/'目录(因为我有不同的图像类型需要进入 /media 的不同子目录),最终会变成 '/media/images/'由于我的 settings.py 中的这个设置:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

现在的问题是我使用接收器方法删除以前上传的图像。
@receiver(pre_save, sender=Image)
def file_update(sender, **kwargs):
instance = kwargs['instance']
print(instance.image.path) ### HERE IS THE PROBLEM
if instance.image:
path = instance.image.path ### HERE IS THE PROBLEM
os.remove(path)

它应该返回这个:
/home/.../media/images/file.jpg

但它返回这个:
/home/.../media/file.jpg

这显然会导致 No such file or directory错误。我错过了什么?

一个简单的技巧是做这样的事情:
path = instance.image.path
name = instance.image.name
correct_path = path.replace(name, 'images/' + name)

但这并不能回答为什么会发生或正确的做法是什么的问题。

更新 :
如果有人遇到同样的问题,我尝试了另一种方法。首先,我使用它的 id 获取对象,然后获取该路径:
instance = kwargs['instance']
if instance.id is not None:
current_image = Image.objects.filter(id=instance.id)[0]
print(current_image.image.path) ### WORKS FINE
os.remove(current_image.image.path) ### WORKS FINE

这种方法有两个好处:
  • 路径将是正确的。
  • 替换图像肯定会起作用,因为我们正在获取先前保存的对象的路径,而不是基于新提交的对象进行计算(如果不存在,可能会导致还没有 ID 的问题)。

  • 唯一的缺点是额外的数据库查询。

    最佳答案

    正如 Abhyudai 指出的那样:您的“问题”仅出现在 pre_save 中.在 post_save你得到了正确的路径。我怀疑只有在实际保存文件时才会生成正确的“路径”(在保存模型之前,它尚未写入最终目的地。

    但是,您仍然可以在 pre_save 中访问所需的数据:

    媒体目录的绝对路径:

    instance.image.storage.base_location # /home/.../media

    你的upload_to的相对路径:
    instance.image.field.upload_to # images/

    请注意 .field因为我们想要字段而不是 FieldFile通常返回

    当然还有你的文件名
    instance.image.name

    如果需要,加入所有这些将为您提供检查和删除现有文件所需的路径

    关于python - 获取在 django 中使用 "upload_to"的上传媒体文件的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59521479/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com