使用Django的REST API获取关系属性

时间:2015-07-20 12:15:05

标签: django rest django-rest-framework

有两个表user, phone由中间表owner链接。这里的目标是使用Rest API来获取特定用户的所有手机, http://127.0.0.1/users/alice/phones/

我使用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

....

2 个答案:

答案 0 :(得分: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)将过滤器添加到 ViewSet

# 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

答案 1 :(得分:0)

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

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

http://127.0.0.1/users/alice/phones会有效!