POST保存后更新模型中的某个字段
我想在保存模型后更新一个字段。为此,我使用了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()完成之前,图像不会被保存到服务器上,我也无法调整它的大小。这就是为什么我只能在save()完成后运行我的函数,这样图像才能被保存到服务器上,我才能调整它的大小。
当用户通过界面尝试保存图像时,我可以使用Update(),在这种情况下我的函数可以正常工作,因为图像已经保存到数据库中。但是当管理员(django-admin)尝试上传图像时,就会出现问题。所以我需要以某种方式调用我的函数,让它在django管理员保存或编辑个人资料图像时被调用,但正如我所说,我的函数只能在实际的save()完成后才能工作。
3 个回答
在使用post_save里面的save()时,我们需要特别小心,因为这样可能会导致重复调用。这里有一个解决办法。
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.save(update_fields=["thumbnail_image"])
post_save.connect(profile_thumbanil, sender=UserProfile)
内部会使用更新的SQL命令,而不是插入命令。
UPDATE row
SET "thumbnail_image" = 'your image'
WHERE "row"."id" = pk
这个方法肯定有效,不过,最好的做法还是使用save()方法。
你可以通过过滤器来获取对象,然后使用更新方法来保存相应的字段。
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)
另一种方法是先断开帖子保存的信号,保存相关字段后再重新连接帖子保存的方法。
你可以重新定义模型的保存方法。在你的情况下,这比使用信号更合适,因为你是在修改同一个实例。
也许这个链接对你有帮助:http://www.martin-geber.com/thought/2007/10/29/django-signals-vs-custom-save-method/