post_delete / pre_delete信号未针对特定发件人

时间:2016-01-26 02:55:22

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

我有一个模型“评论”以及删除评论时采取行动的信号。 删除管理员中的注释时会执行该信号,但在通过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

导入它

与其他删除操作的唯一区别是我覆盖了视图集的“destroy”方法:

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)

1 个答案:

答案 0 :(得分:1)

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

要检查发件人,请创建不带发件人参数的接收者:

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

如果保存的模型是“评论”,为什么可以使用不同的模型调度信号?

当django自动设置延迟模型时会发生这种情况,因此当我期待“评论”时,我得到了类似“Comment_deferred_somefield”的内容。

例如,当查询使用Model.objects.only('field1', 'field2', 'etc')并且only()方法中有一些缺少的字段

时,可能会发生Django自动延迟