我希望用嵌套资源实现我的新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"的文档,"标记路由的额外操作"的文档。