Renaming files in Django FileField

aemdy picture aemdy · Sep 10, 2012 · Viewed 10.8k times · Source

I know that there is a very similar thread here, but I cannot find the solution to my problem.

I need to rename a file which is save in django models.FileField

I tried this

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

And this

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

And many other ways, but nothing seemed to help. A new file is created in all ways, however, data in filefield does not change at all.

EDIT: SOLVED

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

Answer

Brian Neal picture Brian Neal · May 13, 2013

I don't think you need to use raw SQL for this. I think you need to rename the file using the os facility, then set the model's FileField name to the new name. Maybe something like:

os.rename(model.direct_file.path, new_path)
model.direct_file.name = new_name
model.save()