8

我有两个模型:UserTicket有一个用户用户有很多

我已经完成了,当我转到 url /users/1/tickets时,我得到了用户票的列表。

我想使用超链接关系,这是我在用户模型表示中看到的:

"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(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')
4

2 回答 2

18

您可以使用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方法而不是超类中的默认行为。

于 2013-11-04T20:58:11.217 回答
2

作为记录,以下是基于 Joe Holloway 回答的完整解决方案示例:

from rest_framework.reverse import reverse

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__'
于 2017-08-23T22:39:37.890 回答