1

models.py

class Entry(models.Model):
    owner = models.ForeignKey(User, related_name='owner')
    myfile = models.FileField(upload_to='my_files/%Y/%m/%d')

I need to change the extension of previously uploaded files using this model.

Nader Alexan
  • 2,127
  • 22
  • 36
  • This question seems to be well answered here: [How to replace/overwrite/update a file of filefield][1] [1]: http://stackoverflow.com/questions/4787141/django-how-to-replace-overwrite-update-change-a-file-of-filefield – davef Apr 14 '14 at 10:32
  • mar7aba bro massri :) – Muath Apr 25 '14 at 09:26

2 Answers2

1

Note that upload_to can be callable, like this:

import date
import os
def upload_path(instance, filename):
    d = date.today()
    parts = os.path.splitext(filename)
    return 'my_files/%s/%s/%s/%s.%s' % (
        d.year, d.month, d.day, parts[0], 'new_ext')

So, in your model:

class Entry(models.Model):
   # ...
   myfile = models.FileField(upload_to=upload_path)

This won't help you to handle files already uploaded in past, but new uploads will have correct names.

rudyryk
  • 3,695
  • 2
  • 26
  • 33
0

You need to redefine model's save method this way:

import os

    def save(self, *args, **kwargs):
        if self.pk:
            prev_instance = Entry.objects.get(pk=self.pk)
            if prev_instance.myfile:
                 name = os.path.splitext(prev_instance.myfile)[0]
                 os.rename(prev_instance.myfile, name + ".old")
        super(Entry, self).save(*args, **kwargs)
Eugene Soldatov
  • 9,755
  • 2
  • 35
  • 43