如何在Django视图中正确获取序列化程序实例?

时间:2015-11-08 21:32:38

标签: python django django-views serializer django-serializer

我试图在我的覆盖列表方法中获取序列化程序的实例,然后通过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))

1 个答案:

答案 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方法

所以,如果

  1. 您正在发布数据,list方法根本没有被调用(正如@Ivan在上面的第一条评论中所建议的那样)。
  2. 解决方案是将代码移动到适当的方法,即create

    否则

    1. 您的客户正在GETting,调用了list方法,但request.data充其量是空的。
    2. 解决方案是让客户端提供创建的参数作为GET参数,以及name

      这样,视图就会在self.request.query_params

      中找到它们

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