본문 바로가기

web/Django_rest_framework

2. get method 구현



해당 포스팅의 모든 소스는 아래의 링크에서 받을수 있습니다.

https://github.com/uiandwe/django_rest_api/tree/81c17d3ad6f2b9973d702f076479e18f961b6b0e



앞으로 구현할 endpoint들은 다음의 메소드 별로 작동할 것입니다. 


CURD             method                  action

CREATE         POST                    Make New 

RETRIEVE     GET                       List / Search 

UPDATE         PUT/PATCH          Edit 

DELETE         DELETE                Delete



rest api에서 기본적으로 데이터를 가져오는 method는 get 호출입니다.


해당 포스팅에서는 get 을 구현하여 post의 모든 데이터를 list로 가져오는 로직을 구현할 것입니다.





(사실 해당 포스팅만 끝나면 앞으론 너무나 간단합니다. rest framework 가 워낙 잘되어 있어서...)




1.  post 폴더에 api폴더를 생성합니다. 그리고 api 폴더 안에 4개의 파일을 생성합니다. 

     serializers.py  - rest framework에서 쓰일 시리얼라이저 정의 

     urls.py            - rest api url 정의

     views.py         - 각 url 별 로직 구현





2. 먼저 views 파일에 get에 대한 로직을 구현합니다. 

     post/api/views.py


     가장 눈에 띄는 것이 rest_framework의 ListAPIView 입니다. (http://www.django-rest-framework.org/api-guide/generic-views/#listapiview)


     ListAPIView는 데이터만 endpoint로 리턴 시키는 API로 정의 된 객체의 인스턴스를 리턴해줍니다. 


     여기서 정의된 객체는 serializers로 정의되며 (아래에 serializers.py에 구현할 겁니다.), queryset을 통해 가져온 인스턴스를 시리얼라이져에 맞게 리턴해준는 방식입니다.

    

from rest_framework.generics import ListAPIView

from post.models import Post
from post.api.serializers import PostSerializer


class PostListAPIView(ListAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer


3. 위에서 말씀드렸던 시리얼라이져에 대한 정의 입니다. 

    post/api/serializers.py

    

    ModelSerializer (http://www.django-rest-framework.org/api-guide/serializers/#inspecting-a-modelserializer)

    

    저는 일단 title, content, created_at 만을 리턴할 겁니다.

from rest_framework.serializers import ModelSerializer
from post.models import Post


class PostSerializer(ModelSerializer):
class Meta:
model = Post
fields = [
'title',
'content',
'created_at',
]


4. url 부분을 구현합니다.

    post/api/urls.py


    사실 아주 간단하게 구현한다면 view단의 로직을 바로 쓸수도 있습니다. 

 

   url(r'^$', PostListAPIView.as_view(queryset=Post.objects.all(), serializer_class=PostSerializer), name='list')


  앞으로 진행을 위해 (view단에 구현할게 많이 있습니다.) 아래의 소스를 넣어주세요.

from django.conf.urls import url
from django.contrib import admin

from .views import (
PostListAPIView
)


urlpatterns = [
url(r'^$', PostListAPIView.as_view(), name='list'),

]



5. 마지막으로 최종 url을 정의해 줍니다. 


   django_rest_api/urls.py

    (프로젝트 생성시 이름을 달리 했다면 위치가 다를수 있습니다. )


   이제 /api/posts/를 요청하면 endpoint 로 위에서 정의된 로직이 동작하게 되겠죠?!

urlpatterns = [
........
url(r'^api/posts/$', include("post.api.urls", namespace="posts-api"))
]


6. $python3 manage.py runserver 실행후 /api/posts/를 접속해 봅니다. 

     아래와 같이 화면이 나온다면 성공입니다.!!

     django_rest_framework의 가장 좋은 점은 각각의 정의된 endpoint 를 데이터만 보여주는게 아닌 브라우저를 접속시 아래와 같이 method 별로 화면을 보여줍니다. (물론 json으로 리턴이 가능합니다.)


    하지만 데이터가 하나도 없어서 정상적인 리턴인지는 확인이 안되는군요.




7. 데이터를 넣기 위해서 admin페이지를 활용할 예정입니다. 

    먼저 admin유저를 만들어야 겠죠?!


    $python3 manager.py createsuperuser


admin

email (그냥 엔터로 넘어가도 됩니다.)

password

password


    를 넣어줍니다.  (참고로 패스워드는 8자 이상입니다.)





8. 아직 admin에 접속해도 post에 대한 정보를 볼수 없습니다. 


    post.admin.py 에 admin에서 보일 정보들을 정의해 줍니다. 


from django.contrib import admin

# Register your models here.


from .models import Post

class PostModelAdmin(admin.ModelAdmin):
list_display = ["title", "created_at"]
list_display_links = ["created_at"]
list_editable = ["title"]

search_fields = ["title", "content"]
class Meta:
model = Post


admin.site.register(Post, PostModelAdmin)


9. 이제 /admin/ 에 login 합니다. 

     posts가 보이는군요. add 버튼을 통해서 post를 만들어 줍니다. 






10. title 과 content 를 넣어주고 save!




11. 두개 정도 데이터를 넣어습니다. 





12. 이제 다시 /api/posts/를 들어가보면 admin페이지에서 만들었던 데이터들을 볼수있습니다. 





get 에 대한 endpoint 를 아주 간단하게 구현해 보았습니다. 아주 쉽죠?! 

다음으로 리스트가 아닌 하나의 detail 로직을 구현할 예정입니다. 

'web > Django_rest_framework' 카테고리의 다른 글

6 저장/수정시 유저 저장  (0) 2016.07.27
5. create  (0) 2016.07.27
4 update delete  (0) 2016.07.25
3 get detail 구현  (0) 2016.07.25
1. django rest_framework 셋팅  (0) 2016.07.25