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

问题描述

当前,我想在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”,

解决方法

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

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

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

相关问答

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