Django REST Framework中的嵌套资源

Tal*_*etz 15 python django rest nested-resources django-rest-framework

我希望用嵌套资源实现我的新API.

Example: /api/users/:user_id/posts/
Run Code Online (Sandbox Code Playgroud)

将评估特定用户的所有帖子.我还没有看到这个用例的工作示例,也许这不是实现rest API的正确方法?

Ank*_*pli 22

正如评论说达尼洛@link装饰得到了有利于去除@list_route@detail_route装饰.

更新:@detail_route&@list_route弃用赞成@action.

这是替代解决方案:

解决方案1:

@detail_route()
def posts(self, request, pk=None):
    owner = self.get_object()
    posts = Post.objects.filter(owner=owner)

    context = {
        'request': request
    }

    post_serializer = PostSerializer(posts, many=True, context=context)
    return Response(post_serializer.data)
Run Code Online (Sandbox Code Playgroud)

解决方案2:

试试drf-nested-routers.尚未尝试过,但看起来很有希望,许多人已经在使用它.看起来像我们已经尝试实现的高级版本.

希望这可以帮助.


bak*_*kal 5

要映射/api/users/:user_id/posts/可以装饰一个posts你的内部方法ViewSet@link()

from rest_framework.decorators import link
from rest_framework.response import Response


class UserViewSet(viewsets.ModelViewSet):
    model = User
    serializer_class = UserSerializer
    
    # Your regular ModelViewSet things here

    # Add a decorated method like this
    @link()
    def posts(self, request, pk):
        # pk is the user_id in your example
            
        posts = Post.objects.filter(owner=pk)    
        
        # Or, you can also do a related objects query, something like:
        # user = self.get_object(pk)
        # posts = user.post_set.all()

        # Then just serialize and return it!
        serializer = PostSerializer(posts)
        return Response(serializer.data)

    
Run Code Online (Sandbox Code Playgroud)

  • 链接装饰器被删除,支持listed_route 和detail_rout 装饰器:https://github.com/tomchristie/django-rest-framework/commit/f87d32558eb3b36f14a798ec48e4943d25380b92 (3认同)