2017-02-12 3 views
3

Django(1.10)を使用していますので、アップロードされた(メディア)ファイルは数百件あります。私はフォルダの構造を少し変更したいので、すべてのファイルを移動して名前を変更したい。Django:以前にアップロードしたすべてのメディアファイルを新しい場所に移動して名前を変更します

私のmodels.pyには、ファイルを正しい場所に保存する完全に機能するsave()メソッドがありますが、新しいファイルでのみ動作します。私はすでに存在するすべてのファイルを移動したい。

私はすべてのオブジェクトのsaveメソッドを呼び出すだけで、自動的にファイルを移動して名前を変更することを望みましたが、何もしませんでした。

これを行う簡単な方法はありますか?私は本当に簡単な解決策を見落としていると感じています...

+0

新しいディレクトリに 'mv'または' cp'ファイルだけを置いて、ターミナルで名前を変更してください。さて、ジャンゴでは、後でパスを置き換えますか? – Lucas03

+0

まあ、それは完全にはっきりしていないかもしれませんが、ファイルはデータベース/ models.pyに格納されている他の情報に基づいて削除/名前を変更する必要があります。だから、それらを「手動で」動かすことは本当に可能ではないと私は思います。 – Landcross

+0

詳細情報を入力してください。 dbのファイル名/ディレクトリ構造は何ですか?彼らはどのように見えますか? – Lucas03

答えて

1

ここでは、いくつかのスクリプトを行う必要があります。ここでdjango-extensionsを使うことができます。

python manage.py runscript migrate_file 

このスクリプトは、主にファイルを果たしており、あなた:あなたはFile

あなたのモデルを想定すると、プロジェクトの設定と同じに を実行するには、スクリプトレットのmigrate_media_files.py

import os 
from django.conf import settings 
from shutil import copyfile 


def run(): 
    base_dir = settings.BASE_DIR 
    media_dir = os.path.join(base_dir,'project_name/media') 

    for file in Files.objects.all(): 
     old_file_path = os.path.join(media_dir, file.image.name) 
     dir_name = '/{}-{}/{}-{}/'.format(file.theme,file.name,file.id, file.name) 
     if not os.path.exists(os.path.join(media_dir, dir_name)): 
      os.makedirs(os.path.join(media_dir, dir_name)) 
     new_file_name = '/{}-{}/{}-{}/{}-{}.txt'.format(file.theme,file.name,file.id, file.name, file.id, file.name) 
     new_file_path = os.path.join(media_dir, new_file_name) 
     copyfile(old_file_path, new_file_path) 
     file.image.url = new_file_name 
     file.save() 

を書くことができます https://github.com/django-extensions/django-extensions オブジェクト。変更とテストが必要な場合があります。ではごきげんよう。

+0

ありがとう!本当に助けていただきありがとうございます:)私はそれを動作させようとしましたが、old_path_fileのos.path.join行でDjango SuspiciousFileOperation警告を受け取ります。結合されたパスがプロジェクトフォルダの外側にあることを示します(コンソールの印刷された行です)。私はそのエラーがどこから来ているのか分かりません(media_dirは印刷時にうまく見えます)。 – Landcross

+0

私はテストしていないと言いました。 file.imagesはイメージオブジェクトを与える。 file.image.nameを使用してパスを取得する答えを編集しました。私たちはチャットに来ることができます。 –

+0

これで正常に動作しました。疑わしいファイルエラーはちょっとばかげたものでした。どうやら、それはすでに以前の実行のいずれかですべてのファイルを移動しましたが、私は気づいていませんでした。小さなエラーのため、すべてのファイルがドライブのルートフォルダにあるフォルダに移動さ​​れました。私はそれらを削除し、(今は '壊れた')データベースをバックアップに置き換えました。プログラムをもう一度実行すると、ルートに再び移動しました。私は最終的に問題の原因を見つけました:dir_nameとnew_file_nameは/でなければなりません。 – Landcross

関連する問題