【发布时间】:2017-02-09 10:27:02
【问题描述】:
我有一个非常简单的图像模型
class Image(Model):
owner = ForeignKey(User)
img = ImageField(upload_to=image_file_path)
image_file_path 解析为 <username>/images/,其中 username 是 Image 模型实例的 owner.username
现在,当使用 Django admin 更改图像的所有者时,我希望将物理图像文件移动到适当的路径,即<new_username>/images/。
最简单/“正确”的方法是什么?
编辑:
尝试了一下之后的一些想法
post_savehandlers:这个想法是通过在模型更改后将文件移动到正确的位置来确保模型是健全的。问题是,如果发生了一些不好的事情——文件丢失/传输错误(例如,如果存储在 S3 上并且连接不好)/等等——那么你可能会陷入循环尝试恢复更改或结束模型/FS 状态不一致Django 管理员操作:这似乎是一种更安全的方法,因为您可以只复制文件,检查它是否正常,然后更改模型,检查它是否正常,然后删除旧文件。如果出现任何问题,您可以中止,因为这是从管理界面手动启动的,所以用户不会遇到不一致的行为。
pre_save:与“Django 管理操作”相同的过程可能与pre_save一起使用,但如果您因问题而中止,那么用户体验会受到影响。另一方面,如果复制/移动文件失败,用户将无法上传任何内容。
还有第四种方法吗? Django 中的模型有消毒剂吗?
【问题讨论】:
标签: django django-models django-admin