[DRF 튜토리얼] 5. Relationships & Hyperlinked APIs

HL·2021년 2월 1일
0

Django

목록 보기
14/15

User와 Snippet을 연결

루트 페이지 생성

user와 snippet을 한번에 보여줌
reverse로 url name 매칭

# snippets/views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.reverse import reverse


@api_view(['GET'])
def api_root(request, format=None):
    return Response({
        'users': reverse('user-list', request=request, format=format),
        'snippets': reverse('snippet-list', request=request, format=format)
    })

urls.py에도 추가

# snippets/urls.py
path('', views.api_root),
path('snippets/<int:pk>/highlight/', views.SnippetHighlight.as_view()),

하이퍼링크로 API 연결하기

6가지 방법이 있다.

  • primary key 사용
  • entity간에 하이퍼링크로 연결
  • unique identifying slug field 사용
  • 관계 entity의 default string representation 사용
  • 부모로 관계 entity 감싸기
  • custom 하기

여기서는 2번째 방법 사용
기존의 ModelSerializer 에서 HyperlinkedModelSerializer 로 바꿈
차이점은 다음과 같다

  • id 기본적으로 포함하지 않는다
  • url 필드를 포함한다 (HyperlinkedIdentityField 사용)
  • 관계를 위해 PrimaryKeyRelatedField 가 아닌 HyperlinkedRelatedField 사용
# snippets/serializers.py
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    highlight = serializers.HyperlinkedIdentityField(view_name='snippet-highlight', format='html')

    class Meta:
        model = Snippet
        fields = ['url', 'id', 'highlight', 'owner',
                  'title', 'code', 'linenos', 'language', 'style']


class UserSerializer(serializers.HyperlinkedModelSerializer):
    snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippet-detail', read_only=True)

    class Meta:
        model = User
        fields = ['url', 'id', 'username', 'snippets']

highlight 필드를 추가했다
url 필드와 가리키는 뷰가 다른 것을 제외하면 거의 동일하다
html 접미사 추가

URL pattern 에 name 추가하기

serializer 의 url 필드는 기본적으로 {model_name}-detail 을 가리킨다

# snippets/urls.py
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

# API endpoints
urlpatterns = format_suffix_patterns([
    path('', views.api_root),
    path('snippets/',
        views.SnippetList.as_view(),
        name='snippet-list'),
    path('snippets/<int:pk>/',
        views.SnippetDetail.as_view(),
        name='snippet-detail'),
    path('snippets/<int:pk>/highlight/',
        views.SnippetHighlight.as_view(),
        name='snippet-highlight'),
    path('users/',
        views.UserList.as_view(),
        name='user-list'),
    path('users/<int:pk>/',
        views.UserDetail.as_view(),
        name='user-detail')
])

Pagination 추가하기

# tutorial/settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

브라우저 확인

링크

https://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/#creating-an-endpoint-for-the-root-of-our-api

profile
Swift, iOS 앱 개발을 공부하고 있습니다

0개의 댓글