이번 시간에는 rest api 생성시 중요한!!(이라 쓰고 항상 까먹는 부분인..) 참조 url을 만들어보겠습니다.
각 인스턴스마다의 detail url / update url / delete url 를 만들어보겠습니다.
1. post/api/serializers.py에 list 용 시리얼라이져를 따로 만들어줍니다.
Meta의 fields 부분을 보면 url이 추가된것을 볼수 있습니다.
이때 url은 serializers의 HyperlinkedIdentityField를 씁니다.
여기서 view_name은 현재 각 urls.py에 쓰였던 name을 써주면 알아서 url을 만들어줍니다.
여기서 쓰인 posts-api는 /django-rest-api/urls.py에 쓰인 /api/posts/가 입니다.
그리고 뒤에 detail 은 /post/api/urls.py 에 있는 /<포스트아이디>/ 가 됩니다.
lookup_field 부분은 detail 에 있일 pk부분을 명시해줍니다.
결국 url 부분은 위의 둘의 url을 알아서 합쳐서 보여줍니다.
from rest_framework.serializers import ModelSerializer, HyperlinkedIdentityField
class PostListSerializer(ModelSerializer):
url = HyperlinkedIdentityField(
view_name='posts-api:detail',
lookup_field='pk'
)
class Meta:
model = Post
fields = [
'pk',
'user',
'title',
'content',
'created_at',
'url',
]
2. serializer를 새롭게 정의하였으니 post/api/view.py의 PostListAPIView()부분의 시리얼라이져를 위에서 선언한 PostListSerializer()로 변경해 줍니다.
from post.api.serializers import PostSerializer, PostListSerializer
class PostListAPIView(ListAPIView):
serializer_class = PostListSerializer
filter_backends = [SearchFilter, OrderingFilter]
search_fields = ['title', 'content']
pagination_class = PostLimitOffsetPagination
3. 이제 /api/posts/화면에서 확인해 보면 리스트에 url부분이 작성되어 리턴된것을 확인 할수 있습니다.
4. post/api/serializers.py 에 update / delete url을 추가해줍니다.
from rest_framework.serializers import ModelSerializer, HyperlinkedIdentityField
class PostListSerializer(ModelSerializer):
url = HyperlinkedIdentityField(
view_name='posts-api:detail',
lookup_field='pk'
)
delete_url = HyperlinkedIdentityField(
view_name='posts-api:delete',
lookup_field='pk'
)
update_url = HyperlinkedIdentityField(
view_name='posts-api:update',
lookup_field='pk'
)
class Meta:
model = Post
fields = [
'pk',
'user',
'title',
'content',
'created_at',
'url',
'update_url',
'delete_url'
]
5. 다시 /api/posts/로 확인해 보시면 데이터 별로 update/delete url이 추가 된것을 확인 하실수 있습니다.
'web > Django_rest_framework' 카테고리의 다른 글
django에서 swagger로 한다면 drf_yasg 는 왠만하면.... (0) | 2019.05.20 |
---|---|
django REST_FRAMEWORK login (0) | 2019.01.11 |
8 pagination (0) | 2016.07.29 |
7 search (0) | 2016.07.28 |
6 저장/수정시 유저 저장 (0) | 2016.07.27 |