我试图在我的覆盖列表方法中获取序列化程序的实例,然后通过perform_create传递它。基本上这个代码的作用是检查查询集是否为空,如果是,我们执行perform_create
。问题是我试图获取序列化程序的实例,因此我可以将其传递给perform_create
方法。我不相信第serializer = self.get_serializer(data=request.data)
行正确地抓取了序列化程序,因为当我尝试记录它时它没有显示任何内容。感谢任何帮助。谢谢。
class ExampleViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
queryset = Example.objects.all()
serializer_class = ExampleSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwner)
def list(self, request):
queryset = self.get_queryset()
name = self.request.query_params.get('name', None)
# print(request.data)
if name is not None:
queryset = queryset.filter(name=name)
if (queryset.count() == 0):
serializer = self.get_serializer(data=request.data)
print(serializer)
return self.perform_create(serializer)
return HttpResponse(serializers.serialize('json', queryset))
elif name is None:
return HttpResponse(serializers.serialize('json', queryset))
答案 0 :(得分:1)
据我所知,
serializer = self.get_serializer(data=request.data)
您在回复POST
请求时尝试访问GET
数据。
DRF ViewSets提供方法:
list
(调用HTTP GET请求)
create
(调用HTTP POST请求)
retrieve
(调用HTTP GET请求)
update
(调用HTTP PUT请求)
partial_update
(调用HTTP PATCH请求)
destroy
(调用HTTP DELETE请求)
另见this explicit example绑定HTTP谓词到ViewSet方法
所以,如果
list
方法根本没有被调用(正如@Ivan在上面的第一条评论中所建议的那样)。 解决方案是将代码移动到适当的方法,即create
否则
list
方法,但request.data
充其量是空的。解决方案是让客户端提供创建的参数作为GET参数,以及name
。
这样,视图就会在self.request.query_params
如果您有表单,只需通过使用HTTP GET更改其发送数据的方式。见here for further info