Django REST FRAMEWORK Tutorial 10 -- def snippet_list を Class SnippetList に書き直す

15563 단어 django

何が変わるのか



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

@api_view(['GET', 'POST'])
def snippet_list(request, format=None):
    if request.method == 'GET':
    elif request.method == 'POST':

@api_viewの後に def で snippet_list で関数を作って
request.method によって if で分岐して処理していた.

class SnippetList(APIView):
    def get(self, request, format=None):
    def post(self, request, format=None):


これを SnippetList 그렇다고 하는 class を作って
얻다, 게시하다

こうすることで、全體を指すものはクラス、各自メソddを指すものは関数
と分ける ことができるのでコードが見やすくなると推測する.

mat,get_object を関数にして各mesoddから呼び出すようにすることで
コードの可読性が良くなると推測する.


SnippetList のコードを書いていく


api_view の書き換えと Class SnippetList の全體像



from rest_framework.decorators import api_view

今まで関数の前に使っていた api_view에서

from rest_framework.views import APIView


クラスの引数として用いる APIView に変更

class SnippetList(APIView):
    def get(self, request, format=None):
    def post(self, request, format=None):


こうして class 와 def で書き直す.
中身はのロジックは以前 if で分岐していた時と全く同じ.


snippet_detail を書き直す



こちらは新たに作成される get_object が依然to 大きく異なる.

全體構成



class SnippetDetail(APIView):
    def get_object(self, pk):
    def get(self, request, pk, format=None):
    def put(self, request, pk, format=None):
    def delete(self, request, pk, format=None):

このように、SnippetDetail クラスの中に
関数を作っいく.

get_object 사용



以前は def snippet_detail 直下で

    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)


最初に try で snippet 変数に取ってきておいて

    if request.method == 'GET':
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)


各mesoddでは、その を使うようにしていた.

これを今回は

    def get_object(self, pk):
        try:
            return Snippet.objects.get(pk=pk)
        except Snippet.DoesNotExist:
            raise Http404


오브제크트を取ってくる一つの関数 get_object に切り出して

    def get(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)


各メソdd関数で self 에서 self.get_object として 使用する.
JavaScript の this のようなものだと解釈する.

get_object を実際に書く



from django.http import Http404

Http404 を使うので import し

    def get_object(self, pk):
        try:
            return Snippet.objects.get(pk=pk)
        except Snippet.DoesNotExist:
            raise Http404


get_object では pk に応じてOBJECT を取得し
なければ Http404 を返す.
別の関数に切り出し Http404 を使う以外は前回と変更点はない.

가져오기, 넣기, 삭제



    def get(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        snippet = self.get_object(pk)
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

全てのメソdd関数で self 로부터 get_object を使って
現在のprimary key のobjektoを取ってくるようにする.

urls に クラス名を適用して .as_view() もつける.



snippets/urls.py を見ると

urlpatterns = [
    path('snippets/', views.snippet_list),
    path('snippets/<int:pk>/', views.snippet_detail),
]


以前は 조회수. snippet_list になっていたが

class 와 APIView を使うとこれでは読み込めない.

    path('snippets/', views.SnippetList.as_view()),
    path('snippets/<int:pk>/', views.SnippetDetail.as_view()),


견해.の後に SnippetList, SnippetDetail 와
CamelCase に直したクラス名を記述して
.as_view() をつける.

これでクラスベースで読み込まれるようになった.

좋은 웹페이지 즐겨찾기