DRF API設定の3つの設定(read only+required+permission)


今回、国防部はハッカートン大会を開き、Djangoについて議論し、その過程でモデルの要求や権限の変更について多方面の学習を行った.今回は、その中でよく使われるreadonly、required、permissionの3つの設定を整理しました.

read_only


DRFのSerializerフィールドのread only設定の公式ホームページの説明は以下の通りです.
Read-only fields are included in the API output, but should not be included in the input during create or update operations. Any 'read_only' fields that are incorrectly included in the serializer input will be ignored.
簡単に言えば、ユーザがPOSTやPUTを行う場合には、要求には含まれず、GETなどの操作の場合には、目に見える情報である.これはもちろん,ユーザが勝手に変更できないサーバのみが管理する情報を処理する際に用いられる.たとえば、次のコードを表示します.

UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields='__all__'
        read_only_fields = ['experience_point']
上のコードは、ユーザー情報を表すuser serializerファイルです.
こちらです.
read_only_fields = ['experience_point' ]
対応する部分を考えてみましょう.プレイヤーの経験値が変わると、大きな災害が発生します.そのため、サーバ上でread onlyで事前に予防します.

required


requiredは、サーバに必要な情報または非必要な情報を区別します.
Normally an error will be raised if a field is not supplied during deserialization. Set to false if this field is not required to be present during deserialization.
たとえば、次のコードです.
UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields='__all__'
        extra_kwargs = {'profile_image': {'required': False}} 
フェイスブックやKakaoTalkに写真を登録しないと基本的な顔が出るのが普通です.このとき,アバターがユーザアクティビティに必要なファイルではないことがわかる.これは、「required」:Falseオプションで受信したJsonファイルから除外できます.この場合、extra kwargsエントリは非常に便利な機能であり、複数のフィールドのrequiredエントリをそれぞれ編集することができます.

permission



permissionはその名の通り権限を設定します.DRFの場合、rest framework.permissionsから様々な形式の権限設定をインポートできます.たとえば、AllowAnyはすべての人に機能を開放します.以下の場合に会員に加入すると仮定します.
class RegistrationAPI(generics.GenericAPIView):
    permission_classes = [AllowAny]
    serializer_class = CreateUserSerializer

    def post(self, request, *args, **kwargs):
        ...
権限のある人だけが入会できるというのは矛盾している.そのため、会員登録は全員に開放しなければならないので、AllowAnyを使用しなければなりません.
IsAuthenticatedの場合、この機能にアクセスできるのは特権ユーザーのみです.たとえば、アカウントをログアウトする機能は、そのアカウント権限を持つユーザにのみ適用されます.このとき,権限の確認には主にトークンが用いられる.
class LogoutAPI(generics.GenericAPIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        ...
IsAuthenticatedOrReadOnly、GETなどの読み取り専用機能には権限は必要ありませんが、POSTやPUTなどの修正機能には権限が必要です.たとえば、問題掲示板アプリケーションを作成したとします.外部の人も質問と回答を確認することができますが、質問の記入と修正は登録者、すなわち権限のある人だけが行うことができます.次のコードに設定できます.
class QuestionViewSet(viewsets.ModelViewSet):
    permission_classes = [IsAuthenticatedOrReadOnly]
    queryset=Question.objects.all()
    serializer_class=QuestionSerializer

の最後の部分


この記事では,DRFを学習する際によく用いられるモデル設定の組合せをまとめた.内容は簡単ですが、初めてアプリを作った方にとっては良いマイルストーンになると思います.