use*_*731 11 python django django-rest-framework
我有一个ModelViewSet
Django的REST框架,它让我能够通过以下地址进行POST和GET:
api/v1/users
这些用户与评论表有反向关系,我希望能够通过URL访问这些评论:
api/v1/users/<username>/comments
我能够@detail_route
通过覆盖queryset
和设置自定义来实现这一点,serializer_class
但它只适用于GET请求.如果我尝试通过REST Framework的管理部分发布新评论,我会收到一条错误通知,指出"'ListSerializer'对象不可迭代"
这是我的代码:
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserFlat
lookup_field = 'username'
@detail_route(methods=['post','get'])
def comment(self, request, **kwargs):
user = self.get_object()
self.queryset = Comment.objects.filter(recipient=user.id)
self.serializer_class = CommentFlat
serializer = CommentFlat(instance=self.queryset, many=True)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
新评论应采用以下参数:
comment.author,comment.message,comment.recipient
我可以在管理面板中输入所有这些字段并尝试创建一个帖子请求,但它失败了.理想情况下,我只需要填写comment.message和comment.author,并且comment.recipient字段应该使用在网址中获取的user.id自动填充.api/v1/users/<username>/comments
有谁知道为什么我的帖子请求没有完成以及如何自动填充该字段?
use*_*731 14
我想到了.对于那些寻找答案的人来说,解决方案是明确定义request.method == 'POST'
将对象传递给序列化程序时发生的操作.
@detail_route(methods=['post','get'])
def comment(self, request, **kwargs):
user = self.get_object()
self.queryset = Comment.objects.filter(recipient=user.id)
self.serializer_class = CommentFlat
if request.method == 'POST':
# request.data is from the POST object. We want to take these
# values and supplement it with the user.id that's defined
# in our URL parameter
data = {
'comment': request.data['comment'],
'rating': request.data['rating'],
'author': request.data['author'],
'recipient': user.id
}
serializer = CommentFlat(data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# Return GET by default
else:
serializer = CommentFlat(instance=self.queryset, many=True)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14401 次 |
最近记录: |