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

И я нахожу, что в БД сохраняется что-то вроде этого: textFile: http://127.0.0.1:8000/media/Users/usersxxx/Documents/xxx/media/text_file/t5

в то время как не:

http://127.0.0.1:8000/медиа/текстовый_файл/t5,


person Kumar    schedule 20.09.2020    source источник
comment
Каково значение settings.MEDIA_ROOT ?   -  person JPG    schedule 20.09.2020
comment
Это: Users/usersxxx/Documents/xxx/media ; Если я установлю относительный путь напрямую, кажется, что python не может открыть относительный файл напрямую, он сообщит об ошибке, например FileNotFoundError: [Errno 2] Нет такого файла или каталога   -  person Kumar    schedule 20.09.2020


Ответы (1)


Решил эту проблему. Основная причина проблемы из-за того, что 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')
    

Надежда может помочь тому, кто задал аналогичный вопрос.

person Kumar    schedule 21.09.2020