06 rest - framework 의 관계 와 하이퍼링크 API

  • 내용
  • api 루트 노드 의 정지점 만 들 기
  • 하 이 라이트 텍스트 의 정지점 만 들 기
  • 하이퍼링크 인터페이스
  • URL 모드 이름

  • 1. 내용
  • API 인터페이스 에 루트 노드 만 들 기
  • 대상 의 하 이 라이트 디 스 플레이 텍스트 생 성 점
  • 각 API 에 링크 만 들 기
  • 모든 url 모드 가 명명 되 거나 정의 되 는 지 확인 합 니 다
  • 페이지 추가
  • 탐색 인터페이스
  • 이전에 메 인 키 를 사용 하면 내부 집적 성과 발견 가능성 을 높 여야 합 니 다.
    2. api 루트 노드 의 정지점 만 들 기
    #       snippets users   ,             @api_view               。
    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)
        })

    3. 하 이 라이트 텍스트 의 정지점 만 들 기
    JSON 데 이 터 를 되 돌려 주 는 것 외 에 rest 는 두 가지 HTML 렌 더 링 방식 을 제공 합 니 다. - 하 나 는 템 플 릿 templates 렌 더 링 을 이용 하고 다른 하 나 는 pre - rendered 렌 더 링 - + 주의 +: 하 이 라이트 텍스트 를 만 들 때 우리 가 호출 할 수 있 는 일반적인 보기 함수 가 존재 하지 않 습 니 다. - 다른 하 나 는 대상 인 스 턴 스 를 되 돌려 줄 수 없습니다.대상 인 스 턴 스 의 특정한 속성 을 되 돌려 줍 니 다. - 그래서 우 리 는 기본 적 인 보기 함 수 를 이용 하여 자신의 'get' 방법 을 만 듭 니 다.
    from rest_framework import renderers
    from rest_framework.response import Response
    
    class SnippetHighlight(generics.GenericAPIView):
        queryset = Snippet.objects.all()
        #           ,       HTML  
        renderer_classes = (renderers.StaticHTMLRenderer,)
    
        def get(self, request, *args, **kwargs):
            snippet = self.get_object()
            return Response(snippet.highlighted)

    url 경로 추가
    #                    
    url(r'^$', views.api_root), 
    #          
    url(r'^snippets/(?P[0-9]+)/highlight/$', views.SnippetHighlight.as_view()),

    4. 하이퍼링크 인터페이스
    존재 하 는 실체 간 의 관 계 를 처리 하 는 데 다음 과 같은 몇 가지 다른 방식 이 있다.
  • pk 활용
  • 실체 간 에 하이퍼링크 를 사용 하면 직렬 화 는 Hyperlinked Model Serializer
  • 를 계승 해 야 한다.
  • 유일한 표지 필드 링크 와 관련 된 실체
  • 관련 실체의 기본 문자열 표시 형식 사용
  • 관련 실 체 를 부모 클래스 에 끼 워 넣 기
  • 다른 사용자 정의 에 따 르 면 rest 프레임 워 크 는 모든 스타일 을 지원 합 니 다. 우 리 는 전방 향 을 뛰 어 넘 거나 역방향 관 계 를 이용 하여 얻 거나 외부 키 를 사용 할 수 있 습 니 다
  • Hyperlinked Model Serializer 와 Model Serializer 는 다음 과 같은 차이 가 있 습 니 다.
  • 기본적으로 id 필드 가 포함 되 지 않 습 니 다
  • url 필드, Hyperlinked Identity Field 필드 생 성
  • 을 포함 합 니 다.
  • 관 계 는 Primary Key Related Field 가 아 닌 Hyperlinked Related Field 필드 를 통 해 하이퍼링크 시퀀스 로 재 작성 되 었 습 니 다. snippets / serializers. py 에서:
  • class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    
        owner = serializers.ReadOnlyField(source='owner.username')
        #      :views_name,   html,   json,              
        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')

    5. URL 모드 이름
  • 루트 노드, 이름 은 'user - list' and 'snippet - list', 모델 이름 - list
  • 사용자 정의 모델 필드 사용 모델 이름 - 필드 이름
  • 하나의 인 스 턴 스 속성 입 니 다. 모델 이름 - detail 을 사용 하여 이 모든 것 을 우리 의 경로 관리자 에 기록 합 니 다.
  • from django.conf.urls import url, include
    from rest_framework.urlpatterns import format_suffix_patterns
    from snippets import views
    
    # API endpoints
    urlpatterns = format_suffix_patterns([
        url(r'^$', views.api_root),
        url(r'^snippets/$',views.SnippetList.as_view(),name='snippet-list'),
        url(r'^snippets/(?P[0-9]+)/$',views.SnippetDetail.as_view(),name='snippet-detail'),
        url(r'^snippets/(?P[0-9]+)/highlight/$',views.SnippetHighlight.as_view(),
        name='snippet-highlight'),
        url(r'^users/$',views.UserList.as_view(),name='user-list'),
        url(r'^users/(?P[0-9]+)/$',views.UserDetail.as_view(),name='user-detail')
    ])
    
    # Login and logout views for the browsable API
    urlpatterns += [
        url(r'^api-auth/', include('rest_framework.urls',
                                   namespace='rest_framework')),
    ]

    좋은 웹페이지 즐겨찾기