Django-rest-framework: خطأ DestroyAPIView عند on_delete = نماذج. حماية

تم إنشاؤها على ٢٥ أبريل ٢٠١٨  ·  4تعليقات  ·  مصدر: encode/django-rest-framework

خطوات التكاثر

عارضات ازياء:

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

الآراء:

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

سلوك متوقع

كود HTTP 423 أو غيره.
تفاصيل الخطأ.

السلوك الفعلي

استثناء Django

الإصلاح بالنسبة لي

الخلطات:

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

التعليق الأكثر فائدة

يمكن إصلاح ذلك من خلال سطرين فقط من التعليمات البرمجية. من المفترض أن تجعل الأطر الحياة أسهل ، لذا أعتقد أنه يجب إضافة معالجة الاستثناءات التلقائية لحذف النموذج.

ال 4 كومينتر

ستحتاج إلى كتابة طريقة مخصصة للتعامل مع هذه الحالة. لا أعتقد أنه من الشائع بما يكفي لضمان إضافة التعقيد الإضافي إلى الحالة القياسية.

يمكن إصلاح ذلك من خلال سطرين فقط من التعليمات البرمجية. من المفترض أن تجعل الأطر الحياة أسهل ، لذا أعتقد أنه يجب إضافة معالجة الاستثناءات التلقائية لحذف النموذج.

قضية قديمة ، لكنها ما زالت ذات صلة.

من وجهة نظري ، هذا أمر شائع جدًا ويعمل كجزء أساسي للحفاظ على تكامل قاعدة البيانات الخاصة بك.

يجري في هذا أيضا. سيكون من الجيد جدًا أن يتم التعامل مع هذا بشكل افتراضي بدون خطأ 500.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات