【问题标题】:Get relationship attributes with Django's REST API使用 Django 的 REST API 获取关系属性
【发布时间】:2015-07-20 12:15:04
【问题描述】:

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

我使用ModelSerializer 作为序列化程序,使用ViewSet 作为视图。请让我知道如何完成这项工作?我不知道如何路由/users/user_name/phones/ 从特定用户那里获取电话。 谢谢。

代码sn-p:

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

....

【问题讨论】:

  • 这个网址重要吗:/users/user_name/phones/或者你可以用这个/phones/?user=user_name
  • /users/user_name/phones/ 和 /phones/?user=user_name 都可以。前者更像是 Rest 风格。

标签: django rest django-rest-framework


【解决方案1】:

我建议你创建一个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

【讨论】:

  • 谢谢。如何将 /user/user_name/phones 用于用户的电话? Django 官方声明:“如果您有需要路由到的临时方法,您可以使用 detail_route 或 list_route 装饰器将它们标记为需要路由。detail_route 装饰器在其 URL 模式中包含 pk 并且适用于需要单个实例。list_route 装饰器适用于对对象列表进行操作的方法。"
【解决方案2】:

使用 @detail_route 将 URL 路由到您的函数,例如,

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

http://127.0.0.1/users/alice/phones 会起作用的!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2020-12-25
    • 2020-12-05
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多