당신은 멋쟁이, 우리는 장고쟁이~

0%

DRF-Tutorial-30편- API를 하이퍼링크 해주기

Hyperlinking our API


각 요소들의 관계를 다루는것은 우리의 웹 API 디자인에서 조금 더 어려운 부분입니다.


관계를 표현하기 위해서 선택할수 있는 여러가지 다른 방법들이 존재합니다.


  • primary key 사용하기
  • entities 간 하이퍼링크 해주기
  • 고유한 slug 필드를 관계된 entity 에 사용해주기
  • 관계된 entity 의 기본 문자열 표현 사용하기
  • 부모 표현 안에 관계된 entity 네스팅 해주기
  • 기타 다른 사용자 정의 표현

REST Frmaework 은 이 모든 스타일들을 지원합니다. 그리고, 순방향 혹은 역방향 관계들에 적용할수 있습니다. 혹은, generic foreign key 와 같은 커스텀 메니저에도 적용될수 있습니다.


이번에 우리는, entity 간에 하이퍼링크를 해주는 스타일을 사용해 볼겁니다.


이를 하기 위해서는, 기존에 존재하던 ModelSerializer 대신에, 우리의 serializer 를 수정하여 HyperlinkedModelSerializer 를 확장해야 합니다.



HyperlinkedModelSerializerModelSerializer 와 차이점이 있습니다.


  1. 기본값으로 id 필드를 포함하지 않습니다
  2. HyperlinkedIdentityfield 를 사용하여, url 필드를 포함합니다
  3. 관계들은 HyperlinkedRelatedFieldPrimaryKeyRelatedFiedl 대신 사용합니다.

우리는 이미 쉽게 존재하는 serializers 를 재작성하여 hyperlinking 을 사용하도록 만들수 있습니다.


snippets/serializer.py 파일을 열고, 아래를 추가해줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.ReadOnlyFied(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 필드를 추가했다는것을 알고 있어야 합니다. 이필드는 snippet-detail 대신에 snippet-highlight URL 패턴을 가르키는것을 제외하고는, url 필드와 같은 타입의 필드 입니다.


우리는 .json 같은, 접미사 url 을 포함하였기 때문에, highlight 필드에 접미사로된 하이퍼링크들은 .html 접미사를 사용하도록 명시해 줍니다.