2014-04-10 49 views
0

我想在保存後更新模型的一個字段。對於我使用post_save信號但是當我嘗試保存模型,可以始終被困在某種無限循環,到最後我得到max, recursion depth error在POST後更新模型中的字段save

我的代碼如下:

class UserProfile(models.Model): 
    . 
    . 
    . 

def profile_thumbanil(sender, created, instance , **kwargs): 
    profile = UserProfile.objects.get(id = instance.id) 
    thumb = handlers.create_thumbanil(profile.image, profile.user_id) 
    profile.thumbnail_image = thumb 
    profile.save() 

post_save.connect(profile_thumbanil, sender=UserProfile) 

我不知道這裏有什麼錯誤。如果任何人都可以告訴我另一種在post_save之後保存數據的方法,那麼這樣也可以。

感謝

編輯:

保存()將不會在我的情況下工作,因爲我創建圖像的縮略圖,我使用調整它們已經是圖像的腳本存在於服務器和因此直到save()完成其工作圖像將不會保存在服務器上,因此我無法調整它,這就是爲什麼我只能在save()完成其工作後運行我的功能,以便圖像將被保存在服務器上,我可以調整它。

當用戶嘗試通過UI保存圖像時,我可以使用Update(),在這種情況下,我的函數可以工作,因爲圖像已經保存到數據庫中,但是當管理員(django-admin)嘗試上傳圖像時,問題就出現了。 所以我需要調用我的函數,只要django管理員保存/編輯配置文件圖像,我可以調用我的函數,但正如我所說,我的函數只有在實際保存()完成其工作後才起作用。

+0

您需要覆蓋您的'保存()'型號'UserProfile' – Sudipta

+0

@Sudipta我編輯了我的問題plz檢查 – Inforian

+0

有在這個django-imgekit應用程序的檢查。它可以幫助你調整你的大小https://github.com/matthewwithanm/django-imagekit –

回答

1

您可以重新定義模型的保存方法。在你的情況下比使用信號更合適,因爲你修改了同一個實例。

也許這將是有益的: http://www.martin-geber.com/thought/2007/10/29/django-signals-vs-custom-save-method/

+0

我嘗試過,但它不會在我的情況下工作,因爲我創建圖像的縮略圖和我使用的腳本調整服務器上已存在的圖像的大小,因此直到save()完成其工作圖像將不會保存在服務器上,因此我無法調整它,這就是爲什麼我只能在save()完成其工作後才能運行我的函數,以便將圖像保存在服務器上,並且可以調整它的大小。 – Inforian

+1

在這種情況下,你可以這樣做:UserProfile.objects.filter(id = instance.id).update(thumbnail_image = thumb)信號不會被髮送。 –

+1

是的,這工作,我完全忘記了更新()無論如何,你拯救我的一天:)。非常感謝 – Inforian

-1

嘗試QuerySet .update()方法。

更新()不更新在SQL級別,因此,不調用任何save()方法在你的模型,也沒有發出pre_save或post_save信號

或覆蓋。保存()型號:

def save(self, *args, **kwargs): 
    super(YourModel, self).save(*args, **kwargs) 

    other codes... 
+0

是的,我知道,但我想模型中的類似功能,以便無論是從管理或UI保存模型我的功能將工作,我不需要在任何地方調用它。但是,主要關心的是一旦實際數據保存到數據庫後,我想更新該字段。 – Inforian

0

可以使用過濾器獲取對象,然後使用更新的方法來保存相應的字段。

def profile_thumbanil(sender, created, instance , update_fields=["thumbnail_image"], **kwargs): 
    profile = UserProfile.objects.get(id = instance.id) 
    thumb = handlers.create_thumbanil(profile.image, profile.user_id) 
    profile.update(thumbnail_image = thumb) 

post_save.connect(profile_thumbanil, sender=UserProfile) 

另一種方法是斷開後保存信號,保存相關字段,然後重新連接後保存方法。

相關問題