オブジェクトが削除される前に検証を実行して、特定のケースでの削除を防止し、検証エラーとして戻る必要があります。それ、どうやったら出来るの?私が現在していることは正しいとは思わない:
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
ここで必要とするものはありません。何かよりきめ細かな処理が必要ですが、検証段階でエラーが発生します。
私はそれが助けて欲しい