Django media_url 对于文件字段不正确

问题描述

我有一个 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/。 我的意思是网址必须是:
/media/items/file.txt
但我得到: /media/var/www/media/items/file.txt
我的问题是什么,我该如何解决
感谢您的帮助 :D

解决方法

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

  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()

这和上面的方法一样,只是你手动配置。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...