有没有一种方法可以使用Django rest框架仅获取一篇特定文章的评论?

时间:2019-07-24 08:01:51

标签: django python-3.x django-rest-framework django-rest-viewsets

现在,我尝试使用嵌套路由器来解决此问题,但仍然希望能够创建新评论,而无需从请求正文发送博客文章ID。我希望能够从请求参数中获取它。 因此,我该如何获取这个ID一个并使用它来创建新评论

http://127.0.0.1:8000/blog-posts/1/comments/

我的路线如下。


from rest_framework_extensions.routers import NestedRouterMixin

class NestedDefaultRouter(NestedRouterMixin, DefaultRouter):
    pass

router = NestedDefaultRouter()

blog_posts_router = router.register('blog-posts', BlogPostViewSet)

blog_posts_router.register(
    'comments',
    CommentViewSet,
    base_name='comments',
    parents_query_lookups=['blog_post']

)

urlpatterns = [
    path('', include(router.urls))
]

这就是我的视图的样子

from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from .models import BlogPost, Comment
from .serializers import BlogPostSerializer, CommentSerializer
from rest_framework.decorators import action
from django.http import JsonResponse
import json
from rest_framework_extensions.mixins import NestedViewSetMixin


class BlogPostViewSet(NestedViewSetMixin, ModelViewSet):
    """ Handles creating, updating, listing and deleting blog posts. """

    serializer_class = BlogPostSerializer
    queryset = BlogPost.objects.all()


class CommentViewSet(NestedViewSetMixin, ModelViewSet):
    """ Handles creating, updating, listing and deleting comments on blog posts. """

    serializer_class = CommentSerializer
    queryset = Comment.objects.all()

谢谢,我正在等待您的帮助。我从文档中找不到它

1 个答案:

答案 0 :(得分:0)

您可以实现的是继承视图集的create函数,并使用kwarg参数访问帖子的ID。然后,将帖子ID添加到请求数据中,然后再将其传递给序列化器,并使用它来创建新对象。

 def create(self, request, *args, **kwargs):
    post_id = kwargs['parent_lookup_post']
    new_data = request.data.copy()
    new_data['post'] = post_id
    serializer = self.get_serializer(data=new_data)
    serializer.is_valid(raise_exception=True)
    self.perform_create(serializer)
    headers = self.get_success_headers(serializer.data)
    return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)