如何在 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 方法

所以如果

  1. 你正在 POSTing 数据,根本没有调用 list 方法(正如@Ivan 在你上面的第一条评论中所建议的)。

解决方法是将代码移动到合适的方法,即create

否则

  1. 你的客户端正在GETting,调用了list方法,但是request.data充其量是空的。

解决方案是让客户端提供创建参数作为 GET 参数,以及 name

这样视图会在 self.request.query_params

中找到它们

如果您有一个表单,只需更改它发送数据的方式,使其使用 HTTP GET。参见 here for further info