2017-02-09 177 views
0

我有一個非常簡單的圖像模型改變模型實例所有者的時候把鏈接文件複製/在Django管理

class Image(Model): 
    owner = ForeignKey(User) 
    img = ImageField(upload_to=image_file_path) 

image_file_path解析爲<username>/images/,其中username是圖像模型實例現在owner.username

,當使用Django的管理員來更改圖像的所有者,我希望物理圖像文件被移動到適當的路徑,即<new_username>/images/

這樣做最簡單/「正確」的方式是什麼?

編輯:

試驗了一下

  • post_save處理後的一點想法:這個想法是,以確保該模型是理智通過將文件移動到正確的位置後,模型的變化。問題是,如果發生錯誤 - 文件丟失/傳輸錯誤(例如,如果存儲位於S3並且連接不好)/等等 - 那麼您可以最終在一個循環中嘗試恢復更改或最終與一個不一致的模型/ FS狀態

  • Django管理員操作:這似乎是一種更安全的方式,因爲您可以複製文件,檢查確定,然後更改模型,檢查它是否正常,然後刪除舊的文件。如果出現任何問題,可以放棄,因爲這是從管理界面手動啓動的,用戶不會遇到不一致的行爲。

  • pre_save:與'Django admin action'中相同的過程可能與pre_save一起使用,但如果由於問題而中止,則用戶體驗會受到影響。另一方面,如果複製/移動文件是borked,用戶將無法上傳任何東西。

有沒有第四種方法? Django中有模型的消毒器嗎?

回答

1

使用圖像模型的post_save信號。以同樣的方式,您可以使用post_delete刪除記錄時實際刪除圖像文件。

您可以查看信號文檔here

+0

'post_save'有問題,如果文件傳輸沒有通過,我必須恢復模型更改以保持一切健全。返回觸發另一個'post_save' - >可能的循環 – Timo

+0

@Timo在圖像傳輸失敗時執行'post_save'運行嗎?這看起來並不直觀......但如果是這樣的話,您可以在試圖移動它之前添加額外的檢查以查看圖像是否存在於您所期望的位置, –

+0

所有者更改會觸發保存,只會更改所有者,我想要圖像路徑(包括模型實例和磁盤)來反映這種變化。移動/複製'post_save'處理程序中的圖像可能會失敗,然後出現不一致的狀態 - >需要恢復所有者更改 - >可能最終處於循環狀態。 – Timo