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

标签 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

导入它

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

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)

最佳答案

如果 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') 并且 中缺少一些字段时,可能会发生 Django 自动延迟>only() 方法

关于django - post_delete/pre_delete 信号未针对特定发件人触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35006328/

相关文章:

python - django 翻译不适合我

python - 从 Queryset Django 中填充缺失的数据

python - 在 django rest 框架中实现角色

python - 为什么信号不简单地称为事件?

python - 故障排除 'itertools.chain' 对象没有属性 '__getitem__'

django逆向动态id

django - 如何发布到 allauth 注册表以填写初始数据?

django - 处理 url 编码数据时 django rest 框架出现问题

django - 当用户在 Django 管理中激活时发送电子邮件

django - 类型错误 : connect() got an unexpected keyword argument 'signal' - Django signals