Python Rest框架和URL模式
我正在学习Django+Rest框架并尝试制作简单的应用程序,但我对URL模式感到困惑。这只是一个有帖子、投票和评论的博客。我想做的事情是能够向这种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
/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')
。而且它工作得很好