Django-rest-framework: Error de DestroyAPIView cuando on_delete = models.PROTECT

Creado en 25 abr. 2018  ·  4Comentarios  ·  Fuente: encode/django-rest-framework

pasos para reproducir

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()

puntos de vista:

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

Comportamiento esperado

Código HTTP 423 u otro.
Detalle del error.

Comportamiento real

Excepción de Django

Arreglar para mi

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()

Comentario más útil

Esto se puede solucionar con solo un par de líneas de código. Se supone que los marcos hacen la vida más fácil, por lo que creo que se debe agregar el manejo automático de excepciones para la eliminación del modelo.

Todos 4 comentarios

Deberá escribir un método personalizado para manejar este caso. No creo que sea lo suficientemente común como para justificar agregar la complejidad adicional al caso estándar.

Esto se puede solucionar con solo un par de líneas de código. Se supone que los marcos hacen la vida más fácil, por lo que creo que se debe agregar el manejo automático de excepciones para la eliminación del modelo.

Problema antiguo, pero aún así tan relevante.

Desde mi punto de vista, es muy común y sirve como una parte crucial para mantener la integridad de su base de datos.

Me encontré con esto también. Sería muy bueno tener esto manejado por defecto sin un error 500.

¿Fue útil esta página
0 / 5 - 0 calificaciones