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

Некоторые дополнительные функции были добавлены в приложение django, и в результате функция upload_to также расширилась.

Поскольку django по умолчанию хранит имена файлов в базе данных и файлы на диске, никакого вреда не было - новые файлы именуются с использованием новой функции upload_to, а старые файлы продолжают работать.

Тем не менее, это грязно - мы в конечном итоге в ситуации с файлами, такими как

/media/userID/oldfilename.pdf 

а также

/media/app/userID/projectID/newfilename.pdf 

Есть ли способ массового переименования этих файлов? Я думаю, что это можно сделать, перебирая базу данных, проверяя, соответствует ли путь в FileField результату текущего upload_to, а если нет, переименовывать... это кажется распространенной проблемой, так что, возможно, есть более общий выход?

1 ответ

Решение

Простое решение - написать пользовательскую команду управления Django. Вы можете запустить команду, используя стандарт Джанго manage.py,

Что-то вроде этого:

from django.core.management.base import BaseCommand, CommandError
from example.models import YourModel

class Command(BaseCommand):
    args = ''
    help = ''

    def handle(self, *args, **options):

        # Get all objects
        objects = YourModel.objects.all()

        for object in objects: # For each object

            # If old file path:
            if not 'userID/projectID' in objects.filefield.name:
                # Move the file, eg usign shutil http://docs.python.org/library/shutil.html#shutil.move
                # Update filefield
                # save object
Другие вопросы по тегам