2009-11-15 40 views
2

我有一個模型save方法,看起來像這樣:編程方式保存到一個Django的ImageField的圖像創建圖像的無限循環

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中的信息。

任何想法這裏發生了什麼?

回答

3

我認爲從瀏覽調用ImageFileField.save()(實際上是因爲繼承而導致FileField.save())的源代碼導致文件名存儲在其中的實例(即db行)被更新。

這意味着,在您的save方法中,您調用ImageFileField.save(),然後調用您的保存方法,導致遞歸。

從閱讀源代碼,如果你想防止這個,那麼只需通過save=Falseself.image.save。這會將文件數據保存到磁盤,但不會save實例(db行)的數據。但是,在下一行中,通過調用超類來保存它,所以我認爲它將被保存到數據庫中。

事實上,看起來save=Falsesave方法旨在幫助這種情況!

+0

這樣做。謝謝! –

0

我不是100%確定的,但它可能是當self.image.save被調用時,它會默認調用模型的保存方法 - 從而創建你的無限循環。我沒有測試過,但我可以看到發生。

我的建議,如果是這樣的問題:發送一個signal從模型保存方法包含該實例,然後有一個單獨的功能來下載/解析圖像並保存它。

相關問題