post_delete/pre_delete 信号未针对特定发件人触发
post_delete/pre_delete signals not firing for specific sender
我有一个模型 "Comment" 和一个在评论被删除时采取行动的信号。
信号在管理中删除评论时执行,但通过 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)
如果 sender 参数与您期望的模型不匹配,post_delete 和 pre_delete 将不会被触发。
要检查发送方,创建一个没有发送方参数的接收方:
@receiver(post_delete)
def comment_post_delete(sender, instance, *args, **kwargs):
if sender == Comment:
# do something
如果保存的模型是 "Comment",为什么信号可以用不同的模型发送?
这可能发生在 django 自动设置延迟模型时,所以当我期待 "Comment" 时,我得到了 "Comment_deferred_somefield".
Django 自动延迟可能会发生,例如当查询使用 Model.objects.only('field1', 'field2', 'etc')
并且 only()
方法
中缺少一些字段时
我有一个模型 "Comment" 和一个在评论被删除时采取行动的信号。 信号在管理中删除评论时执行,但通过 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)
post_delete 和 pre_delete 将不会被触发。
要检查发送方,创建一个没有发送方参数的接收方:
@receiver(post_delete)
def comment_post_delete(sender, instance, *args, **kwargs):
if sender == Comment:
# do something
如果保存的模型是 "Comment",为什么信号可以用不同的模型发送?
这可能发生在 django 自动设置延迟模型时,所以当我期待 "Comment" 时,我得到了 "Comment_deferred_somefield".
Django 自动延迟可能会发生,例如当查询使用 Model.objects.only('field1', 'field2', 'etc')
并且 only()
方法