如何在 Django 视图中正确获取序列化程序实例?
How to properly get a serializer instance in Django view?
我试图在我覆盖的列表方法中获取序列化程序的实例,然后通过 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))
据我所知,
serializer = self.get_serializer(data=request.data)
您正试图在响应 GET
请求时访问 POST
数据。
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 方法
所以如果
- 你正在 POSTing 数据,根本没有调用
list
方法(正如@Ivan 在你上面的第一条评论中所建议的)。
解决方法是将代码移动到合适的方法,即create
否则
- 你的客户端正在GETting,调用了
list
方法,但是request.data
充其量是空的。
解决方案是让客户端提供创建参数作为 GET 参数,以及 name
。
这样视图会在 self.request.query_params
中找到它们
如果您有一个表单,只需更改它发送数据的方式,使其使用 HTTP GET。参见 here for further info
我试图在我覆盖的列表方法中获取序列化程序的实例,然后通过 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))
据我所知,
serializer = self.get_serializer(data=request.data)
您正试图在响应 GET
请求时访问 POST
数据。
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 方法
所以如果
- 你正在 POSTing 数据,根本没有调用
list
方法(正如@Ivan 在你上面的第一条评论中所建议的)。
解决方法是将代码移动到合适的方法,即create
否则
- 你的客户端正在GETting,调用了
list
方法,但是request.data
充其量是空的。
解决方案是让客户端提供创建参数作为 GET 参数,以及 name
。
这样视图会在 self.request.query_params
如果您有一个表单,只需更改它发送数据的方式,使其使用 HTTP GET。参见 here for further info