Skip to content

Instantly share code, notes, and snippets.

@avoiney
Last active June 12, 2021 12:46
Show Gist options
  • Save avoiney/5248673 to your computer and use it in GitHub Desktop.
Save avoiney/5248673 to your computer and use it in GitHub Desktop.
Manually associate an existing file to a model FileField
# Assuming you have a Article Model like this
# class Article(models.Model):
# ... Some field
# media = models.FileField(upload_to="path_to_inner_media_folder", blank=True)
from django.core.files.base import ContentFile
import os
# Create an article with the associated model
new_article = Article()
original_file_path = 'path'
new_file_path = 'new_path'
fh = open(original_file_path, "r")
if fh:
# Get the content of the file
file_content = ContentFile(fh.read())
# Set the media attribute of the article, but under an other path/filename
new_article.media.save(new_file_path, file_content)
# Save the article
new_article.save()
# Close the file and delete it
fh.close()
if fh.closed:
os.remove(unicode(fh.name))
del fh
@ncopiy
Copy link

ncopiy commented Oct 9, 2019

@andrestone that was works for me:

file_path = "..."  # it should be relative path to your settings.MEDIA_ROOT  
article.file = file_path  
article.save()```

@avoiney
Copy link
Author

avoiney commented Oct 29, 2019

@CarliJoy much more better! Thanks!

@ncopiy It may works if the file is already saved in the dir your model file field expect.
But if you want to deal with InMemoryFile or StringIO content, this snippets should handle the model file field base path you defined. It a little more complicated though, so it depends on your needs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment