POST保存后更新模型中的一个字段

时间:2014-04-10 06:57:08

标签: python django django-models models

我希望在保存后更新模型的一个字段。为此我使用 post_save信号,但是当我尝试保存模型时,它总是被困在某种无限循环中,最后我得到max, recursion depth error

我的代码如下:

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()完成其工作图像将不会被保存在服务器上,因此我无法调整大小,这就是为什么我只能在save()完成其工作后运行我的函数,以便将图像保存在服务器上,我可以调整它。

当用户尝试通过UI保存图像时,我可以使用Update(),在这种情况下我的功能正常工作,因为Image已经保存到db中,但是当admin(django-admin)尝试上传图像时,问题就出现了。 因此,我需要以这样的方式调用我的函数:每当django admin保存/编辑配置文件图像时,我可以调用我的函数,但正如我所说,我的函数仅在实际的save()完成其工作后才有效。

3 个答案:

答案 0 :(得分:1)

您可以重新定义模型的保存方法。在您的情况下,它比使用信号更合适,因为您修改了相同的实例。

也许这会有所帮助: http://www.martin-geber.com/thought/2007/10/29/django-signals-vs-custom-save-method/

答案 1 :(得分:0)

您可以使用过滤器获取对象,然后使用update方法保存相应的字段。

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)

另一种方法是断开保存后信号,保存相关字段,然后重新连接保存后方法。

答案 2 :(得分:-2)

尝试QuerySet .update()方法。

  

update()在SQL级别进行更新,因此不会在模型上调用任何save()方法,也不会发出pre_save或post_save信号

在模型上

或覆盖.save():

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

    other codes...