1

I'm trying to get an instance of a serializer in my overwritten list method and then pass it in through perform_create. Basically what this code does is it checks if the queryset is empty and if it is, we do a perform_create. The problem is that I'm trying to get an instance of the serializer so I can pass it in to the perform_create method. I don't believe the line serializer = self.get_serializer(data=request.data) correctly grabs the serializer as it shows nothing when I try to log it. Any help is appreciated, thanks.

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))
4

1 回答 1

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 请求调用)

另请参阅这个将 HTTP 动词绑定到 ViewSet 方法的显式示例

因此,如果

  1. 您正在发布数据,list根本没有调用该方法(正如@Ivan 在您上面得到的第一条评论中所建议的那样)。

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

否则

  1. 您的客户正在获取,该list方法被调用,但request.data充其量是空的。

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

这样视图就会在其中找到它们self.request.query_params

如果您有一个表单,只需更改它发送数据的方式,使其使用 HTTP GET。请参阅此处了解更多信息

于 2015-11-08T22:24:45.480 回答