Django REST FRAMEWORK Tutorial 11 -- SnippetList を Mixin を使って短く書き換える

14953 단어

메리트



https://www.django-rest-framework.org/tutorial/3-class-based-views/#using-mixins

Mixin を使うと短くかけるらしい.

    def get(self, request, format=None):
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = SnippetSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


これが

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


2行ずつで書けるようになるらしい.正気か?


SnippetList を Generics 와 Mixins を使って書く




from rest_framework import mixins
from rest_framework import generics


믹스인, 제네릭, (을) 가져오기

class SnippetList(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):


APIView の代わり에
ListModelMixin, CreateModelMixin, GenericAPIView,
これらを使い

    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer


스니펫 のOBJECTO全てを queryset 変数に入れて
Snippet の시리아라이저를 serializer_class 変数に入れる

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


get でも 포스트 でも *args, **kwargs を使うことによって
queryset 과 serializer_class を使えるようになると推測する.

get の場合は self.list 에
Snippets 오브제크트を시리아라이즈시て全て返す
메솜드가 입으세요

포스트 の場合は self.create に
request の中のデータをシリアライズして
Era-handringして結果を返す
메솜드가 입으세요

と推測する.

動作確認しても、問題なく以前と同じように動いた.

SnippetDetail で Generics と Mixin を使う



class SnippetDetail(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    generics.GenericAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

SnippetDetail でも同じように Mixin 와 Generics のモジュール?を引数にとる.

今回は Mixin では Retrieve, Update, Destory, を使う

get が list ではなく、retrieve になっている.

こちらも問題なく動作確認できた.

詳細での取得も上書きも削除も、恐ろしいほど簡単にかけた.

Generics を使って .list, .create や .retreive, .update, .destroy, をまとめる



さらに簡単に書く方法がある.

Mixin すら使わず、Mixin で使っていた相当のmesodを最初に Generics でまとめてしまう方法だ.

class SnippetList(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer


class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer


generics.ListCreateAPIView 에서 List, Create

generics.RetrieveUpdateDestroyAPIView
で 검색, 업데이트, 파괴,

をモジュールから持ってきてしまえると推測する.

こちらも問題なく動作確認ができた.

まとめ



오브제크트を取得して
シリアライザにかけて、保存や削除をして〜
と書いていたこード(을)를

class SnippetList(mixins.ListModelMixin,
                  generics.GenericAPIView):

    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)


List, Create 등의 Mixin 과 Generics を使うことで
return する箇所に self.list() と書くだけで実装できた.

class SnippetList(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer


また、Generics を使い、最初に Mixin の各mesoddを明記することで
return すら書かずに簡略化して書くことが可能だった.

좋은 웹페이지 즐겨찾기