2017-02-09 84 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