2012-02-03 53 views
2

將一些附加功能添加到了django應用程序中,因此upload_to函數也得到了擴展。重命名django FileField文件

由於django默認存儲數據庫中的文件名和磁盤上的文件,所以沒有造成傷害 - 新文件使用新的upload_to函數命名,而舊文件繼續工作。

然而,這是混亂的 - 我們在文件的情況類似

/media/userID/oldfilename.pdf 

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

最終有沒有一種方法來批量重命名這些文件?我想這可以通過遍歷數據庫來完成,檢查FileField中的路徑是否與當前upload_to的結果匹配,如果沒有,重命名..這似乎是一個常見問題,所以也許有更通用的方法呢?

+0

我不知道這樣做的任何方式,不涉及自己編寫的腳本。 – 2012-02-03 19:49:36

回答

1

簡單的解決方案是編寫自定義Django management command。您可以使用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 
+0

是的,這就是我所說的'通過數據庫啞循環' - 我想知道是否有合理的方法來做到這一點 - 我可能會把它包含在模型的.save()方法中,以便讓它首先在頻繁訪問的模型上完成 – qdot 2012-02-13 19:33:34

+1

'啞循環'似乎是一次徹底解決問題的乾淨解決方案。覆蓋保存只會減少'混亂'。 – 2012-02-13 21:45:39

+0

只是好奇。如果這只是爲了運行一次,那麼將數據遷移實施起來不是更好嗎?但是如果您預先將自己的文件路徑/命名方案改爲未來,請將其作爲上面的mgmt cmd來執行? – ckot 2018-02-19 17:56:21