Django-rest-framework: Hancurkan kesalahanAPIView saat on_delete=models.PROTECT

Dibuat pada 25 Apr 2018  ·  4Komentar  ·  Sumber: encode/django-rest-framework

Langkah-langkah untuk mereproduksi

model:

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

dilihat:

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

Perilaku yang diharapkan

Kode HTTP 423 atau lainnya.
Detil kesalahan.

Perilaku sebenarnya

Pengecualian Django

Perbaiki untuk saya

campuran:

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

Komentar yang paling membantu

Ini dapat diperbaiki hanya dengan beberapa baris kode. Kerangka kerja seharusnya membuat hidup lebih mudah jadi saya pikir penanganan pengecualian otomatis untuk penghapusan model harus ditambahkan.

Semua 4 komentar

Anda harus menulis metode khusus untuk menangani kasus ini. Saya tidak berpikir itu cukup umum untuk menjamin penambahan kompleksitas ekstra ke kasing standar.

Ini dapat diperbaiki hanya dengan beberapa baris kode. Kerangka kerja seharusnya membuat hidup lebih mudah jadi saya pikir penanganan pengecualian otomatis untuk penghapusan model harus ditambahkan.

Masalah lama, tapi masih sangat relevan.

Dari sudut pandang saya, ini sangat umum dan berfungsi sebagai bagian penting untuk menjaga integritas database Anda.

Berlari ke dalam ini juga. Akan sangat menyenangkan jika ini ditangani secara default tanpa kesalahan 500.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat