问题描述
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/。
我的意思是网址必须是:
/media/items/file.txt
但我得到:
/media/var/www/media/items/file.txt。
我的问题是什么,我该如何解决?
感谢您的帮助 :D
解决方法
所以我一直在尝试不同的东西并找到了答案。
所以你有两个选择:
- 将保存过程交给 Django。
- 删除 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()
这和上面的方法一样,只是你手动配置。