Django-rest-framework: 当 on_delete=models.PROTECT 时 DestroyAPIView 错误

创建于 2018-04-25  ·  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 等级