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 評価