Django Rest Framework,使嵌套关系超链接 [英] Django Rest Framework, hyperlinking a nested relationship

查看:100
本文介绍了Django Rest Framework,使嵌套关系超链接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个模型:用户门票门票有一个用户用户有许多门票



我已经实现了,当我访问url / users / 1 / tickets 时,我正在获取用户的票证列表。



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

 门票:[
http://127.0.0.1:8000/tickets/5/,
http://127.0.0.1:8000/tickets/6/
]

但我希望它像

 门票: http://127.0.0.1:8000/users/1/门票 

是否可以使用DRF做到这一点?



网址:

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

视图:

 类TicketsByUserList(generics.ListAPIView): 
模型=票证
serializer_class = TicketSerializer

def get_queryset(self):
user_pk = self.kwargs.get('user_pk',None)
如果user_pk不是None:
返回Ticket.objects.filter(user = user_pk)
return []

用户序列化程序(我尝试使用票证字段定义,更改类型,view_name,但无效):

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

类Meta:
模型= MyUser
字段=('id','昵称','电子邮件','门票')

票证序列化器:

 类TicketSerializer(serializers.HyperlinkedModelSerializer):
用户= serializers.HyperlinkedRelatedField(view_name ='myuser-detail')
喜欢= serializers.Field(source ='liked' )

类元:
模型=票证
字段=('id','user','word','transcription','translation','liked', 'created','updated')


解决方案

SerializerMethodField 对其进行自定义。像这样的东西:

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

类元:
模型= MyUser
字段=('id','昵称','电子邮件','门票')

为了简洁起见,我在此处硬连线了URL,但是您也可以进行反向查找。这基本上就是告诉它调用 get_tickets 方法,而不是超类中的默认行为。


I've got two models: User and Ticket. Ticket has one User, User has many Tickets

I've accomplished that when i go to url /users/1/tickets, i'm getting the list of user's tickets.

I want to use hyperlinked relations, and here is what i see in my User model representation:

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

But I want it to be like

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

Is there a way to do that with DRF?

The url:

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

The view:

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 []

User serializer (i tried to play with tickets field definition, changing type, view_name, but with no effect):

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

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

Ticket serializer:

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')

解决方案

You can use a SerializerMethodField to customize it. Something like this:

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')

I hard-wired the URL in there for brevity, but you can do a reverse lookup just as well. This basically just tells it to call the get_tickets method instead of the default behavior in the superclass.

这篇关于Django Rest Framework,使嵌套关系超链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆