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

Tre*_*ier 2 python django

我在模型上有一个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)    
Run Code Online (Sandbox Code Playgroud)

由于某种原因,这会创建一个无限循环的图像创建,_文件名中的 s 越来越多。当我收到 Django 错误时,我终于发现它正在这样做,该错误说它试图保存的文件包含太多字符(我发现保存了 242 个图像)。

我试图使用这个问题中的信息。

知道这是怎么回事吗?

Nic*_*ood 6

我认为通过浏览源代码,调用ImageFileField.save()(实际上FileField.save()是由于继承)会导致存储文件名的实例(即数据库行)被更新。

这意味着在你的save方法中你调用ImageFileField.save()中,该方法又调用您的保存方法,从而导致递归。

通过阅读源代码,如果你想阻止这种情况,那么只需传递save=Falseself.image.save. 这会将文件数据保存到磁盘,但不会将save实例(数据库行)数据保存到磁盘。然而,在下一行中,您通过调用超类来保存它,所以我认为它将被保存到数据库中。

事实上,看起来该save=False方法save就是为了帮助解决这种情况而设计的!