post_delete/pre_delete сигналы не срабатывает для конкретного отправителя

У меня есть модель "Комментарий" и сигнал для выполнения действий при удалении комментария. Сигнал выполняется при удалении комментария в админке, но не при удалении через 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, но так работает мое приложение. Следует также отметить, что многие другие сигналы работают нормально.

Все сигналы объявляются в отдельном файле signal.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)

1 ответ

Решение

post_delete и pre_delete не будут запущены, если параметр отправителя не соответствует ожидаемой модели.

Чтобы проверить отправителя, создайте получателя без параметра отправителя:

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

Почему сигнал может отправляться с другой моделью, если сохраняемая модель была "Комментарий"?

Это может произойти, когда django автоматически установит отложенную модель, поэтому, когда я ожидал "Комментарий", я получил что-то вроде "Comment_deferred_somefield".

Автоматическая отсрочка Django может произойти, например, когда запрос использует Model.objects.only('field1', 'field2', 'etc') и есть некоторые пропущенные поля в only() метод

Другие вопросы по тегам