0

我有一个 DRF 项目,其模型如下:

class MyModel(models.Model):
    id = models.UUIDField(default=uuid4, primary_key=True, unique=True)
    output_file = models.FileField(null=True, blank=True, max_length=200)
    geometry = models.PolygonField()
    created_at = models.DateTimeField(auto_now_add=True)

在该模型中,output_file是在服务器处理后由应用程序保存的文件(用户不直接为该字段上传文件)。该文件保存在MEDIA_ROOT中的某个位置。
我的MEDIA_ROOT = " /var/www/media/ " 和MEDIA_URL =" /media/ " 和文件例如保存在 " /var/www/media/items/file.txt " 中。
当我序列化这个模型时,我得到以下结果作为响应 json:

{
    "id": "b2544986-4cfd-****-b349-defd3db****",
    "output_file": "/media/var/www/media/items/file.txt",
    "geometry": "something",
    "created_at": "2021-03-08T19:55:42.068976+03:30"
}

如您所见,我在 URL 的开头有多余的/media/。我的意思是 URL 必须是:
/media/items/file.txt
但我得到: /media/var/www/media/items/file.txt
我的问题是什么,我该如何解决?
感谢您的帮助:D

4

1 回答 1

0

所以我一直在尝试不同的事情并找到了答案。
所以你有两个选择:

  1. 将保存过程交给 Django。
  2. 从 URL 的开头删除MEDIA_ROOT 。

第一个选项

from django.core.files import File
obj = MyModel.object.create(**kwargs)

with open(path) as f:
    obj.output_file.save(new_name, File(f))

这会将文件保存在/media/items/file.txt中,该文件被重定向到/var/www/media/items/file.txt

第二种选择

obj.output_file = path.replace('/var/www/media/', '/media/')
obj.save()

这就像上面的方法,但您只是手动配置它。

于 2021-03-09T09:23:34.647 回答