Django 在 MEDIA_ROOT 文件夹中创建文件并将其保存到 FileField

Posted

技术标签:

【中文标题】Django 在 MEDIA_ROOT 文件夹中创建文件并将其保存到 FileField【英文标题】:Django Create file in MEDIA_ROOT folder and save it to FileField 【发布时间】:2021-01-06 12:57:16 【问题描述】:

目前我想在 MEDIA_ROOT 文件夹下创建一个文件并将其保存到 FileField。我在 SO 网站上搜索,尝试了 django-how-to-create-a-file-and-save-it-to-a-models-filefield 和其他上的方法,但看起来它在我的数据库中保存了绝对路径。

我的模特

class Voice(models.Model):
    xxx other field
    textFile = models.FileField(null=True,blank=True,default=None,upload_to='text_file', unique=True)

更新 textFile 字段如下:

@receiver(post_save, sender=Voice)
def create_text(sender,**kwargs):
    xxx
    f = open(settings.MEDIA_ROOT + '/text_file/'+ text_file,'w')
    queryset = Voice.objects.all()
    queryset.filter(pk=voice.pk).update(textFile=File(f))
    f.close()

我发现它在 db 上保存了这样的内容: "textFile": "http://127.0.0.1:8000/media/Users/usersxxx/Documents/xxx/media/text_file/t5"

虽然不是:

"http://127.0.0.1:8000/media/text_file/t5",

【问题讨论】:

settings.MEDIA_ROOT 的值是多少? 它的:“用户/usersxxx/Documents/xxx/media”;如果我直接设置相对路径,好像python不能直接打开相对文件,会报“FileNotFoundError: [Errno 2] No such file or directory”之类的错误 【参考方案1】:

解决了这个问题。由于python无法打开具有相对路径的文件,导致问题的根本原因。所以我们可以分两步解决这个问题。

    从绝对路径打开文件如下(使用绝对路径)
    f = open(settings.MEDIA_ROOT + '/text_file/'+ text_file + '.txt','w')
    f.close()
    
    然后更新/保存文件(使用相对路径)
    queryset.filter(pk=voice.pk).update(textFile='text_file/' + text_file + '.txt')
    

希望可以帮助遇到类似问题的人。

【讨论】:

以上是关于Django 在 MEDIA_ROOT 文件夹中创建文件并将其保存到 FileField的主要内容,如果未能解决你的问题,请参考以下文章

Django - MEDIA_ROOT 和 MEDIA_URL

在 Django 开发期间提供静态媒体:为啥不 MEDIA_ROOT?

Django 1.4(MEDIA_ROOT、STATIC_ROOT、TEMPLATE_DIRS)

在 django settings.py 中更新 media_root 时遇到问题

Django MEDIA_URL 和 MEDIA_ROOT

Django MEDIA_URL 附加完整的 MEDIA_ROOT