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()
метод