我有两种模型:User和Ticket。票证有一个用户,用户有多个票证
我已经实现了,当我转到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')
您可以使用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
方法而不是超类中的默认行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句