Django-rest-framework: DestroyAPIView-Fehler bei on_delete=models.PROTECT

Erstellt am 25. Apr. 2018  ·  4Kommentare  ·  Quelle: encode/django-rest-framework

Schritte zum Reproduzieren

Modelle:

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

Ansichten:

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

Erwartetes Verhalten

HTTP-Code 423 oder ein anderer.
Fehlerdetails.

Tatsächliches Verhalten

Django-Ausnahme

Fix für mich

Mischungen:

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

Hilfreichster Kommentar

Dies kann mit nur ein paar Zeilen Code behoben werden. Frameworks sollen das Leben einfacher machen, daher denke ich, dass eine automatische Ausnahmebehandlung für das Löschen von Modellen hinzugefügt werden sollte.

Alle 4 Kommentare

Sie müssen eine benutzerdefinierte Methode schreiben, um diesen Fall zu behandeln. Ich glaube nicht, dass es häufig genug ist, um die zusätzliche Komplexität zum Standardfall hinzuzufügen.

Dies kann mit nur ein paar Zeilen Code behoben werden. Frameworks sollen das Leben einfacher machen, daher denke ich, dass eine automatische Ausnahmebehandlung für das Löschen von Modellen hinzugefügt werden sollte.

Altes Thema, aber immer noch so relevant.

Aus meiner Sicht ist es sehr verbreitet und dient als entscheidender Bestandteil, um Ihre Datenbankintegrität zu erhalten.

Läuft auch darauf ein. Wäre sehr schön, wenn dies standardmäßig ohne 500-Fehler behandelt würde.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen