Python Rest框架和URL模式

Python Rest框架和URL模式,python,python-3.x,django-rest-framework,Python,Python 3.x,Django Rest Framework,我正在学习Django+Rest框架并尝试制作简单的应用程序,但我对URL模式感到困惑。这只是一个有帖子、投票和评论的博客。我想做的事情是能够向这种url模式发送请求以留下注释/addcomment。我只有404个。我可以用另一种更简单的方法来做,比如在请求数据中发送帖子id,但我正在学习,想知道如何做我想做的事情。 我试图覆盖视图集的创建方法。试图通过序列化程序从url获取post_id,可能根本不可能。然后我找到了动作装饰,我不知道我应该在这里使用它,为什么它们不工作 型号 class Co

我正在学习Django+Rest框架并尝试制作简单的应用程序,但我对URL模式感到困惑。这只是一个有帖子、投票和评论的博客。我想做的事情是能够向这种url模式发送请求以留下注释
/addcomment
。我只有404个。我可以用另一种更简单的方法来做,比如在请求数据中发送帖子id,但我正在学习,想知道如何做我想做的事情。 我试图覆盖视图集的创建方法。试图通过序列化程序从url获取post_id,可能根本不可能。然后我找到了动作装饰,我不知道我应该在这里使用它,为什么它们不工作

型号

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET("deleted"))
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    body = models.TextField(max_length=1000)
    added_on = models.DateTimeField(auto_now=True)
class CommentViewSet(viewsets.ModelViewSet):
    serializer_class = CommentSerializer
    model = Comment

    @action(detail=True, methods=['post'])
    def addcomment(self, request, post_id=None):
        if post_id:
            post = Post.objects.filter(post=post_id)[0]
            comment = Comment.objects.create(user=request.user, post=post, body=request.data.get('body'))
            comment.save()
            return Response({"detail": "You've left the comment!"}, status=HTTP_200_OK)
        else:
            return Response(status=HTTP_400_BAD_REQUEST)
path(r'^{post_id}/addcomment/$', views.CommentViewSet.as_view({"post": "addcomment"}), name='add-comment')
序列化程序

class CommentSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField('get_user')
    post = serializers.SerializerMethodField('get_post')

    def get_user(self):
        request = self.context.get('request')
        return request.user

    # here I tried to get post_id from context but it doesn't work
    # def get_post(self):
    #     post_id = self.context.get('post_id')
    #     post = Post.objects.filter(id=post_id)[0]
    #     return post

    class Meta:
        model = Comment
        fields = ('body', 'post', 'user')
视图

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET("deleted"))
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    body = models.TextField(max_length=1000)
    added_on = models.DateTimeField(auto_now=True)
class CommentViewSet(viewsets.ModelViewSet):
    serializer_class = CommentSerializer
    model = Comment

    @action(detail=True, methods=['post'])
    def addcomment(self, request, post_id=None):
        if post_id:
            post = Post.objects.filter(post=post_id)[0]
            comment = Comment.objects.create(user=request.user, post=post, body=request.data.get('body'))
            comment.save()
            return Response({"detail": "You've left the comment!"}, status=HTTP_200_OK)
        else:
            return Response(status=HTTP_400_BAD_REQUEST)
path(r'^{post_id}/addcomment/$', views.CommentViewSet.as_view({"post": "addcomment"}), name='add-comment')
URL

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET("deleted"))
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    body = models.TextField(max_length=1000)
    added_on = models.DateTimeField(auto_now=True)
class CommentViewSet(viewsets.ModelViewSet):
    serializer_class = CommentSerializer
    model = Comment

    @action(detail=True, methods=['post'])
    def addcomment(self, request, post_id=None):
        if post_id:
            post = Post.objects.filter(post=post_id)[0]
            comment = Comment.objects.create(user=request.user, post=post, body=request.data.get('body'))
            comment.save()
            return Response({"detail": "You've left the comment!"}, status=HTTP_200_OK)
        else:
            return Response(status=HTTP_400_BAD_REQUEST)
path(r'^{post_id}/addcomment/$', views.CommentViewSet.as_view({"post": "addcomment"}), name='add-comment')
我也不知道在使用ActionDecorator时应该如何声明url模式。我应该使用
路由器.注册
还是在URL模式列表中使用另一个
路径
?在文档中,我只找到了示例模式和我在StackOverflow上找到的
views.CommentViewSet.as_view({“post”:“addcomment”})
行。
我向
blog/1/addcomment
发送post请求,响应为404。我在这里遗漏了什么,所以服务器无法识别URL?

好吧,经过多次尝试后,我认为可能是迁移出了问题,在我尝试做到这一点后,Django最后警告我使用URL模式。似乎从某个版本开始,我需要使用
re_path
而不是常规的
path
来使用命名主键(可能我对术语有误,但问题是模式中的
?P
)。 所以现在我的url看起来像
re_path(r'(?P\d+)/addcomment/),views.CommentViewSet.as_view({'post':'addcomment'}),name='add-comment')
。而且它工作得很好