Django REST框架中的嵌套资源



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

Example: /api/users/:user_id/posts/

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

正如Danilo所评论的,@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)

解决方案2:

尝试drf-nested-routers。还没有尝试过,但看起来很有希望,很多人已经在使用它了。看起来像是我们已经在努力实现的高级版本。

希望这能有所帮助。

要映射/api/users/:user_id/posts/,可以使用@link()ViewSet中装饰posts方法

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)
    

正如Danilo Cabello之前所评论的,您将使用@detail_route@list_route而不是@link()。有关详细解释,请阅读"路由器"的文档"额外链接和操作"one_answers"ViewSets"的文档,"标记路由的额外操作"的文档。

相关内容

  • 没有找到相关文章

最新更新