/ / Django RESTフレームワーク:削除前に検証する - django、validation、django-rest-framework

Django RESTフレームワーク:削除前に検証する - django、validation、django-rest-framework

オブジェクトが削除される前に検証を実行して、特定のケースでの削除を防止し、検証エラーとして戻る必要があります。それ、どうやったら出来るの?私が現在していることは正しいとは思わない:

class CallDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = XCall.objects.all()
serializer_class = CallSerializer
...

def pre_delete(self, obj):
if obj.survey:
raise serializers.ValidationError("Too late to delete")

回答:

回答№1は2

権限で解決できます:

from rest_framework import permissions

class IsSurvey(permissions.BasePermission):


def has_object_permission(self, request, view, obj):

if request.method == "DELETE" and obj.survey:
return False


return True

次に、ビューのpermission_classesに追加します。

from permissions import IsSurvey

class MyViewSet(viewsets.ModelViewSet):
permission_classes = (IsSurvey, )

回答№2については2

私が見つけた解決策は、api上のdestroyメソッドをオーバーライドすることでした。

class CallDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = XCall.objects.all()
serializer_class = CallSerializer
...

def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if obj.survey:
return Response(data={"message": "Too late to delete"},
status=status.HTTP_400_BAD_REQUEST)
self.perform_destroy(obj)
return Response(status=status.HTTP_204_NO_CONTENT)

私にとっては、 破壊する メソッドは、アクセス許可のチェックのみを行い、検証に関連するメッセージは返さないため、前述のavances123のようにオブジェクトのアクセス許可のチェックを検証する代わりに使用します。

希望は助けます;)


回答№3の場合は1

むしろ ValidationError私は パースエラー またはエラーの説明に適合する別のカスタムエラー:

from rest_framework import exceptions
def pre_delete(self, obj):
if obj.survey:
raise exceptions.ParseError("Too late to delete")

回答№4の場合は0

更新

validateは削除時に呼び出されません。

うーん。はい。その場合、私は例外を pre_delete あなたと同じように delete を包む destroy 〜を呼び出す try ブロック。

もし、あんたが except ValidationError as e あなたは手で望む応答を構築するためにそれを使うことができます...

return Response({"error" : e.message})

...など。

あなたはおそらく self._errors 既存のエラー応答の振る舞いを活用することができますが、私はそれをどうやって行うのか考えることはできません。

私はそれが助けて欲しい

最初の回答(didn "t work):

のドキュメントをチェックしてください オブジェクトレベル検証.

実装する validate 調査が設定されているかどうかを確認する:

def validate(self, attrs):
if attrs["survey"]
raise serializers.ValidationError("Too late to delete")
return attrs

もし attrs ここで必要とするものはありません。何かよりきめ細かな処理が必要ですが、検証段階でエラーが発生します。

私はそれが助けて欲しい