2013-11-04 3 views
7

두 모델이 있습니다 : 사용자티켓. 티켓사용자, 많은 티켓Django Rest Framework, 중첩 된 관계 하이퍼 링크

내가 /사용자/1/티켓를 URL로 갈 때, 나는 사용자의 티켓의 목록을 얻고 있음을 이룬있다 사용자가 있습니다. 할 수있는 방법이 있나요

"tickets": [ 
    "http://127.0.0.1:8000/tickets/5/", 
    "http://127.0.0.1:8000/tickets/6/" 
] 

그러나 나는 그것이

"tickets": "http://127.0.0.1:8000/users/1/tickets" 

처럼되고 싶어요 :

내가 여기에 하이퍼 링크 된 관계를 사용하려면, 그리고

내가 내 사용자 모델 표현에서 볼 것입니다 DRF와 그거?

URL입니다 :

url(r'^users/(?P<user_pk>\d+)/tickets/$', 
    views.TicketsByUserList.as_view(), 
    name='myuser-tickets'), 

뷰 :

class TicketsByUserList(generics.ListAPIView): 
    model = Ticket 
    serializer_class = TicketSerializer 

    def get_queryset(self): 
     user_pk = self.kwargs.get('user_pk', None) 
     if user_pk is not None: 
      return Ticket.objects.filter(user=user_pk) 
     return [] 

사용자 시리얼은 (내가하지만 효과, 유형, VIEW_NAME을 변경, 티켓 필드 정의와 재생하려고) :

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    tickets = serializers.HyperlinkedRelatedField(many=True, view_name='ticket-detail') 

    class Meta: 
     model = MyUser 
     fields = ('id', 'nickname', 'email', 'tickets') 

티켓 시리얼보기 :

class TicketSerializer(serializers.HyperlinkedModelSerializer): 
    user = serializers.HyperlinkedRelatedField(view_name='myuser-detail') 
    liked = serializers.Field(source='liked') 

    class Meta: 
     model = Ticket 
     fields = ('id', 'user', 'word', 'transcription', 'translation', 'liked', 'created', 'updated') 

답변

15

SerializerMethodField을 사용하여 사용자 정의 할 수 있습니다. 이런 식으로 뭔가가 :

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    tickets = serializers.SerializerMethodField('get_tickets') 

    def get_tickets(self, obj): 
     return "http://127.0.0.1:8000/users/%d/tickets" % obj.id 

    class Meta: 
     model = MyUser 
     fields = ('id', 'nickname', 'email', 'tickets') 

나는 간결 거기에 URL을 하드 유선,하지만 당신은 단지뿐만 아니라 역방향 조회를 할 수 있습니다. 이것은 기본적으로 수퍼 클래스의 기본 동작 대신 get_tickets 메서드를 호출하도록 지시합니다. ,

class WorkProjectSerializer(serializers.CustomSerializer): 
    issues = drf_serializers.SerializerMethodField() 

    def get_issues(self, obj): 
     request = self.context.get('request') 
     return request.build_absolute_uri(reverse('project-issue-list', kwargs={'project_id': obj.id})) 

    class Meta: 
     model = WorkProject 
     fields = '__all__' 
+0

솔루션을 구현하기 위해 노력하고, 내가 어떻게 든 시리얼 라이저에 요청 개체를 전달할 수있는 것을 깨달았다 동안 : 공식적으로 – optimistiks

+1

[serializer에 추가 컨텍스트를 제공하는 방법] (http://django-rest-framework.org/api-guide/serializers.html#including-extra-context)이 있습니다. 문서는 사용 사례의 사례로서 정확한 상황을 보여줍니다. –

+2

'get_tickets' 메쏘드에서'request = self.context.get ('request')'로 요청 객체를 얻을 수 있고 평소처럼'reverse'를 호출 할 수 있습니다. – Cartucho

0

, 여기에 조 할로 웨이의 답변에 따라 전체 솔루션의 예입니다 함수를 역순으로 전달하여 절대 URL을 얻습니다. 필자는 뷰 "dispatch"메서드에서 요청 객체를 serializer의 필드로 전달하여이 문제를 해결했습니다. 하지만 필자는 serializer에서 요청 개체를 갖기를 원할 때마다 디스패치 메서드를 재정의하는 것이 좋지 않다고 생각합니다. serializer에서 요청을 얻는 가장 좋은 방법은 무엇입니까?
관련 문제