Django-rest-framework: Erro DestroyAPIView quando on_delete = models.PROTECT

Criado em 25 abr. 2018  ·  4Comentários  ·  Fonte: encode/django-rest-framework

Passos para reproduzir

modelos:

class Region(models.Model):
    name = models.CharField(max_length=255)
    code = models.IntegerField()


class District(models.Model):
    region = models.ForeignKey('Region', related_name='districts', on_delete=models.PROTECT)
    name = models.CharField(max_length=255)
    code = models.IntegerField()

Visualizações:

class RegionDelete(generics.DestroyAPIView):
    queryset = Region.objects.all()
    serializer_class = RegionSerializer

Comportamento esperado

Código HTTP 423 ou outro.
Detalhe do erro.

Comportamento real

Exceção Django

Conserto para mim

mixins:

class DestroyModelMixin(object):
    """
    Destroy a model instance.
    """
    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        try:
            self.perform_destroy(instance)
        except django.db.models.deletion.ProtectedError as e:
            return Response(status=status.HTTP_423_LOCKED, data={'detail':str(e)})
        return Response(status=status.HTTP_204_NO_CONTENT)

    def perform_destroy(self, instance):
        instance.delete()

Comentários muito úteis

Isso pode ser corrigido com apenas algumas linhas de código. Supõe-se que os frameworks tornem a vida mais fácil, então acho que o tratamento automático de exceções para a exclusão do modelo deve ser adicionado.

Todos 4 comentários

Você precisará escrever um método personalizado para lidar com este caso. Não acho que seja comum o suficiente para garantir o acréscimo de complexidade extra ao case padrão.

Isso pode ser corrigido com apenas algumas linhas de código. Supõe-se que os frameworks tornem a vida mais fácil, então acho que o tratamento automático de exceções para a exclusão do modelo deve ser adicionado.

Problema antigo, mas ainda assim tão relevante.

Do meu ponto de vista é muito comum e serve como parte crucial para manter a integridade do seu banco de dados.

Correndo para isso também. Seria muito bom ter isso tratado por padrão sem um erro 500.

Esta página foi útil?
0 / 5 - 0 avaliações