【问题标题】:post_delete/pre_delete signals not firing for specific senderpost_delete/pre_delete 信号未针对特定发件人触发
【发布时间】:2016-05-02 13:44:41
【问题描述】:

我有一个模型“评论”和一个在评论被删除时采取行动的信号。 该信号在管理员删除评论时执行,但在通过 django-rest-framework 删除时不执行。

@receiver(post_delete, sender=Comment, dispatch_uid=str(uuid.uuid1())) # I tried also removing dispatch_uid
def comment_post_delete(sender, instance, *args, **kwargs):

我不确定这是否与 django-rest-framework 相关,但这就是我的应用程序的工作方式。 需要注意的另一件事是,许多其他信号都可以正常工作。

所有信号都在一个单独的文件 signals.py 中声明,我在 models.py 的末尾用一个简单的import signals 导入它

与其他删除操作的唯一区别是我重写了视图集的“销毁”方法:

class CommentViewSet(mixins.CreateModelMixin,
                     mixins.DestroyModelMixin,
                     mixins.ListModelMixin,
                     viewsets.GenericViewSet):
    serializer_class = CommentSerializer
    def destroy(self, request, *args, **kwargs):
        # only the comment author or the media owner are allowed to delete
        instance = self.get_object()
        if request.user != instance.user and request.user != instance.media.owner:
            error = {'detail': 'No tienes permiso para borrar este comentario'}
            return Response(data=error, status=status.HTTP_403_FORBIDDEN)
        return super(CommentViewSet, self).destroy(request, args, kwargs)

【问题讨论】:

    标签: django django-rest-framework django-signals


    【解决方案1】:

    如果 sender 参数与您期望的模型不匹配,则不会触发 post_delete 和 pre_delete。

    要检查发送者,请创建一个不带发送者参数的接收者:

    @receiver(post_delete)
    def comment_post_delete(sender, instance, *args, **kwargs):
        if sender == Comment:
            # do something
    

    如果保存的模型是“评论”,为什么信号会被不同的模型调度?

    当 django 自动设置延迟模型时,可能会发生这种情况,所以当我期待“评论”时,我得到了类似“评论延迟”之类的东西。

    Django 自动延迟可能会发生,例如当查询使用 Model.objects.only('field1', 'field2', 'etc') 并且 only() 方法中缺少一些字段时

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2012-07-31
      • 2011-09-21
      • 2013-05-10
      • 1970-01-01
      相关资源
      最近更新 更多