Django-rest-framework: Erreur DestroyAPIView lorsque on_delete=models.PROTECT

Créé le 25 avr. 2018  ·  4Commentaires  ·  Source: encode/django-rest-framework

Étapes à reproduire

des modèles:

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

vues :

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

Comportement prévisible

Code HTTP 423 ou autre.
Détail de l'erreur.

Comportement réel

Exception Django

Correction pour moi

mélanges :

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

Commentaire le plus utile

Cela peut être corrigé avec seulement quelques lignes de code. Les frameworks sont censés faciliter la vie, je pense donc que la gestion automatique des exceptions pour la suppression de modèle devrait être ajoutée.

Tous les 4 commentaires

Vous devrez écrire une méthode personnalisée pour gérer ce cas. Je ne pense pas que ce soit assez courant pour justifier l'ajout de la complexité supplémentaire au cas standard.

Cela peut être corrigé avec seulement quelques lignes de code. Les frameworks sont censés faciliter la vie, je pense donc que la gestion automatique des exceptions pour la suppression de modèle devrait être ajoutée.

Vieux problème, mais toujours aussi pertinent.

De mon point de vue, c'est très courant et c'est un élément crucial pour maintenir l'intégrité de votre base de données.

Courir dans cela aussi. Ce serait très bien que cela soit géré par défaut sans erreur 500.

Cette page vous a été utile?
0 / 5 - 0 notes