Переименование файлов в Django FileField

Я знаю, что здесь есть очень похожая тема, но я не могу найти решение своей проблемы.

Мне нужно переименовать файл, который сохраняется в моделях django.FileField

я пробовал это

os.rename(old_path, new_path)
mod.direct_file = File(open(new_path))
mod.save()

И это

mod.direct_file.save(new_path, File(open(old_path)))
os.remove(old_path)

И много других способов, но ничего вроде не помогало. Новый файл создается всеми способами, однако данные в файловом поле вообще не меняются.

РЕДАКТИРОВАНИЕ: РЕШЕНО

os.rename(old_path, new_path)
cursor = connection.cursor()
cursor.execute("UPDATE mods_mod SET direct_file = %s WHERE id = %s", [new_name, mod.id])
transaction.commit_unless_managed()

person aemdy    schedule 10.09.2012    source источник


Ответы (4)


Я не думаю, что вам нужно использовать для этого необработанный SQL. Я думаю, вам нужно переименовать файл, используя средство os, а затем установить имя модели FileField на новое имя. Может быть, что-то вроде:

os.rename(model.direct_file.path, new_path)
model.direct_file.name = new_name
model.save()
person Brian Neal    schedule 13.05.2013
comment
Это будет работать только при использовании FileSystemStorage. - person WhyNotHugo; 27.11.2020

Текущая документация Django гласит:

«Когда вы получаете доступ к FileField в модели, вам предоставляется экземпляр FieldFile в качестве прокси для доступа к базовому файлу». См. документы для дальнейшего чтения.

Вместо того, чтобы использовать объект Python File для открытия файла, вы должны использовать FieldFile.open(), чтобы открыть файл, а затем соответствующим образом изменить путь к файлу. После этого сохраните объект модели, и изменения пути должны сохраниться.

person droxey    schedule 10.09.2012
comment
Метод Open открывает уже назначенный файл. FieldFile не имеет способа открыть другой файл. - person aemdy; 11.09.2012
comment
Файл назначается через FileField, верно? Вы пытаетесь изменить все файлы в вашей модели или один экземпляр модели? - person droxey; 11.09.2012
comment
Я хочу переименовать файл direct_file = models.FileField(default=None, blank=True, null=True, upload_to="mod_files"), загруженный в это поле. - person aemdy; 11.09.2012
comment
Мне до сих пор неясно, пытаетесь ли вы переименовать поле модели «direct_file» или вы пытаетесь переименовать фактический файл, хранящийся в файловой системе. Мой ответ применяется при попытке переименовать файл, хранящийся в файловой системе. - person droxey; 11.09.2012
comment
Я хочу переименовать файл в файловой системе. - person aemdy; 11.09.2012

Я столкнулся с этой проблемой, когда большие двоичные объекты были сохранены в django без расширения файла, и я хотел это исправить. Лучше всего использовать при циклическом просмотре отфильтрованного набора запросов.

Вы не можете изменить instance.picture.path, и попытка доступа к instance.picture.file.* приведет к ошибке, поскольку при доступе к нему будет предпринята попытка открыть старый файл. Установка instance.picture.name по-прежнему не позволит вам получить доступ к instance.picture.file.* даже после сохранения.

Вы можете просто установить сам объект ImageField в местоположение, и все будет работать:

(Проверено с джанго 1.10)

import imghdr
import os

from django.db import models

class MyModel(models.Model):
    picture = models.ImageField()

instance = MyModel.objects.first()
if os.path.exists(instance.picture.path):
    extension = imghdr.what(instance.picture.path)
    os.rename(instance.picture.path, instance.picture.path + '.' + extension)
    instance.picture = instance.picture.name + '.' + extension
    instance.save()
person miigotu    schedule 15.02.2017

Вы можете использовать следующее:

Предположим, что «obj» — это объект django, который вы хотите переименовать. Затем сделайте следующее:

obj.file_field_name.name = новое_имя

объект.сохранить()

person user8446586    schedule 10.01.2020