Skip to main content
 首页 » 编程设计

python之以编程方式将图像保存到 Django ImageField 正在创建图像的无限循环

2024年08月12日53dudu

我在一个看起来像这样的模型上有一个save方法:

def save(self, force_insert=False, force_update=False): 
    img_url = "http://example.com/%s.jpg" % (self.title) 
    name = urlparse(img_url).path.split('/')[-1] 
    content = urllib.urlretrieve(img_url) 
    self.image.save(name, File(open(content[0])), save=True) 
    super(Test, self).save(force_insert, force_update)     

出于某种原因,这会创建无限循环的图像创建,文件名中的 _ 会越来越多。当我收到一个 Django 错误,提示它试图保存的文件有太多字符(我发现保存了 242 张图像)时,我终于弄清楚它是这样做的。

我试图使用来自 this question 的信息.

知道这里发生了什么吗?

请您参考如下方法:

我认为通过浏览源代码调用 ImageFileField.save() (实际上是 FileField.save() 由于继承)导致实例(即db row) 待更新的文件名所在的行。

这意味着在您的 save 方法中,您调用了 ImageFileField.save(),后者又调用了您的 save 方法,从而导致递归。

从阅读源代码来看,如果你想避免这种情况,只需将save=False传递给self.image.save即可。这会将文件数据保存到磁盘,但不会保存实例(数据库行)数据。然而,在下一行中,您通过调用父类(super class)来保存它,所以我认为它会被保存到数据库中。

事实上,save 方法中的 save=False 似乎旨在帮助处理这种情况!