Django,post_delete,使用反向关系是否安全?

时间:2016-05-19 03:08:37

标签: django django-signals

假设专辑有歌曲。

删除歌曲时,我想更新专辑对象的歌曲数量 (我们假设我们将歌曲的数量存储在数据库字段中)

安全吗

@receiver(post_delete, sender=Song)
def set_song_count(sender, song, **kwargs):
  song.album_set.update_song_count()

Song有ForeignKey to Album。没有涉及M2M。

1 个答案:

答案 0 :(得分:1)

不,这不安全。来自documentation

  

请注意,该对象将不再存在于数据库中,因此请务必小心使用此实例。

此时实例已从数据库中删除。尝试获取song.album_set将(除非它已在其他地方预取,您不能依赖)将触发与此相关的对象的数据库查询。我不认为你会收到错误,但因为数据库中不再存在该对象,所以你只会得到一个空的结果。

您可以考虑使用pre_delete信号来运行一些减少相关相册计数的代码。您也可以使用delete方法on the model itself执行此操作。