Как создать новый upload_to для папки FileField из views.py

в models.py,

class Files(models.Model):
    File = models.FileField(upload_to="documents/")

в моем views.py все работает отлично, когда я удаляю 3-ю строку

file = Files(File=f)
file.File.upload_to('Media/')
file.save()

Вопрос есть.

Я хочу создать новую upload_to папку только из views.py. это вообще ВОЗМОЖНО? Я знаю метод создания папки с помощью функции экземпляра, используемый в models.py, я не хочу его использовать

Вы можете задать имя файла, и таким образом работать с:

from django.conf import settings
from os.path import join as pathjoin

file = Files(File=f)
old_path = car.photo.path
file.File.name = f'Media/{file.File.name}'
new_path = pathjoin(settings.MEDIA_ROOT, file.File.name)
rename(path, new_path)
file.save()

Таким образом, сначала мы создаем объект Files с f в качестве File, затем проверяем путь, создаем новое имя, а затем перемещаем файл в новый каталог и обновляем объект Files в базе данных.

Вы можете сделать это массово, перечислив все элементы Files и установить файл, как описано в ответе. Вместо сохранения объекта напрямую, вы можете собрать их в список и выполнить .bulk_update(…) [Django-doc]:

from django.conf import settings
from os.path import join as pathjoin

files = list(Files.objects.all())
for file in files:
    old_path = car.photo.path
    file.File.name = f'Media/{file.File.name}'
    new_path = pathjoin(settings.MEDIA_ROOT, file.File.name)
    rename(path, new_path)
Files.objects.bulk_update(files, ['File'])
Вернуться на верх