2015-07-20 57 views
0

有两个表user, phone,它们通过中间表owner链接。这里的目标是使用Rest API从特定用户获取所有电话,即 http://127.0.0.1/users/alice/phones/使用Django的REST API获取关系属性

我使用ModelSerializer作为串行器,ViewSet作为视图。请让我知道如何做到这一点?我不知道如何路由/users/user_name/phones/从特定用户获取手机。 谢谢。

代码片段:

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model=User 

class PhoneSerializer(serializers.ModelSerializer): 
    class Meta: 
     model=Phone 

class OwnerSerializer(serializers.ModelSerializer): 
    class Meta: 
     model=Owner 
     depth=1 

// views 
class UserViewSet(viewsets.ModelViewSet): 

    queryset=User.objects.all() 
    serializer_class=UserSerializer 


class PhoneViewSet(viewsets.ModelViewSet): 

    queryset=Phone.objects.all() 
    serializer_class=PhoneSerializer 

.... 
+0

是否使用这个URL很重要:'/ users/user_name/phones /'或者你可以使用这个'/ phones /?user = user_name'? –

+0

/users/user_name/phones /和/ phones /?user = user_name都可以。前者更像休息风格。 – frogcd

回答

0

我建议你创建一个filter

这将是这样的:

1)创建过滤器(确保django-filter安装):

# filters.py 
import django_filters 


class PhoneFilter(django_filters.FilterSet): 

    user = django_filters.Filter(name="user__user_name") 

    class Meta: 
     model = Phone 
     fields = ('user',) 

2)添加过滤器,以您的视图集中

# views.py 
class PhoneViewSet(viewsets.ModelViewSet): 

    queryset=Phone.objects.all() 
    serializer_class=PhoneSerializer 
    filter_backends = (filters.DjangoFilterBackend,) 
    filter_class = filters.PhoneFilter 

现在你可以使用这个网址:/phones/?user=user_name

+0

谢谢。如何使用/ user/user_name/phones到用户的电话? Django官方声明:“如果你有特定的方法需要被路由到,你可以将它们标记为需要使用detail_route或list_route装饰器进行路由。 detail_route装饰器在其URL模式中包含pk,用于方法它需要一个实例,list_route修饰器专用于在对象列表上操作的方法。“ – frogcd

0

使用@detail_route路由URL到您的功能,例如,

@detail_route(methods=['get']) 
def phones(self, request, pk=None): 
    pass 

http://127.0.0.1/users/alice/phones将工作!

相关问题