在Django admin中更改模型实例所有者时复制/移动链接文件

时间:2017-02-09 10:27:03

标签: django django-models django-admin

我有一个非常简单的图像模型

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

image_file_path解析为<username>/images/其中username是图片模型实例&#39; s owner.username

现在,当使用Django admin更改图像的所有者时,我希望将物理图像文件移动到适当的路径,即<new_username>/images/

什么是最简单的&#34;正确的&#34;这样做的方式?

编辑:

经过一些实验后的一些想法

  • post_save处理程序:我们的想法是通过在模型更改后将文件移动到正确的位置来确保模型是正确的。问题是如果发生了不好的事情 - 文件丢失/传输错误(例如,如果存储在S3上并且连接不好)/等等 - 那么你可以在循环中尝试恢复更改或最终模型/ FS状态不一致

  • Django管理员行动:这似乎是一种更安全的方式,因为您可以复制文件,检查它是否正常,然后更改模型,检查它是否正常,然后删除旧文件。如果有任何中断,您可以中止,因为这是从管理界面手动启动的,因此用户不会遇到不一致的行为。

  • pre_save:与&#39; Django管理员操作相同的过程&#39;可能与pre_save一起使用,但如果由于问题而中止,则用户体验会受到影响。另一方面,如果复制/移动文件被剔除,用户无论如何都无法上传任何内容。

有第四种方式吗? Django中的模型是否有消毒杀菌剂?

1 个答案:

答案 0 :(得分:1)

使用Image模型的post_save信号。以同样的方式,您可以使用post_delete在删除记录时实际删除图像文件。

您可以查看信号文档here