Django REST Framework 中的嵌套资源

Posted

技术标签:

【中文标题】Django REST Framework 中的嵌套资源【英文标题】:Nested resources in Django REST Framework 【发布时间】:2014-12-15 00:42:00 【问题描述】:

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

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

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

【问题讨论】:

你卡在哪里了?这很简单,假设您已经设置了 OAUTH2。 我的 serlizer 会怎么样?选择哪些相关领域? github.com/alanjds/drf-nested-routers 【参考方案1】:

正如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。还没有尝试过,但看起来很有希望,很多人已经在使用它。看起来像是我们已经尝试实现的高级版本。

希望这会有所帮助。

【讨论】:

@PranjalMittal 使用 @detail_route(methods=['post'])。查看文档here【参考方案2】:

要映射/api/users/:user_id/posts/,您可以在ViewSet 中使用@link() 装饰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)

    

【讨论】:

链接装饰器被移除,取而代之的是listed_route和detail_rout装饰器:github.com/tomchristie/django-rest-framework/commit/…【参考方案3】:

如之前的commented by Danilo Cabello,您将使用@detail_route@list_route 而不是@link()。详细解释请阅读"Routers", section "Extra link and actions" 和"ViewSets", section "Marking extra actions for routing" 的文档。

【讨论】:

以上是关于Django REST Framework 中的嵌套资源的主要内容,如果未能解决你的问题,请参考以下文章

Django-rest-framework 中的全局异常处理

Django-Rest-Framework 中的序列化程序问题

如何从 django-rest-framework 中的文件列表中过滤图像

Django Rest Framework 中的 JWT 身份验证错误“无效签名”

Django REST framework视图

django框架学习六:优化views.py文件,使用rest_framework中的APIVew和Response返回