Python 通过编程方式将图像保存到Django ImageField,创建了一个无限的图像循环

Python 通过编程方式将图像保存到Django ImageField,创建了一个无限的图像循环,python,django,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(

我在一个模型上有一个
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)    
出于某种原因,这将创建一个无限的图像创建循环,文件名中包含越来越多的
s。当我得到一个Django错误,说它试图保存的文件有太多字符(我发现保存了242个图像)时,我最终发现它是这样做的

我试图使用来自的信息


知道这里发生了什么吗?

我不是100%确定,但可能是当调用
self.image.save
时,默认情况下,它也会调用模型的save方法-从而创建无限循环。我还没有测试过,但我可以看到这种情况发生


我的建议是:从包含该实例的modelsave方法中发送一个,然后使用一个单独的函数下载/解析图像并保存它

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

这意味着在
save
方法中调用
ImageFileField.save()
,它反过来调用save方法,从而导致递归

在阅读源代码时,如果要防止这种情况,只需将
save=False
传递到
self.image.save
。这将把文件数据保存到磁盘,但不会保存实例(db行)数据。但是,在下一行中,您通过调用超类来保存它,因此我认为它将保存到数据库中

事实上,
save
方法上的
save=False
似乎就是为了帮助解决这个问题而设计的