如何在APIView中获取序列化程序字段?

时间:2017-11-13 03:44:38

标签: python django django-rest-framework

如何在APIView中获得 serializer-fields

在文档中,它只说明如何在序列化程序中添加序列化程序字段,但没有说明如何在APIView中获取序列化程序字段。

我在serializer-fields中添加了很多CloudServerCreateSerializer

class CloudServerCreateSerializer(ModelSerializer):

    cpu = serializers.IntegerField()  # eg:1,2,4,
    ram = serializers.IntegerField()  # eg: 1,2,4,
    os = serializers.DictField()  # eg: {"os_big":"Linux", "os_detail":"CentOS7.2"}

    disk_os = serializers.DictField()  # {"disk_type":"SSD", "disk_size":"50"}
    disk_store = serializers.ListField()  # [{"disk_type":"SSD", "disk_size":"50"}, {"disk_type":"SSD", "disk_size":"50"}]

    class Meta:
        model = CloudServer
        exclude = ['expiration_time']

但我不知道如何在视图中获取这些值:

class CloudServerCreateAPIView(CreateAPIView):
    serializer_class = CloudServerCreateSerializer
    permission_classes = []
    queryset = CloudServer.objects.all()

    def post(self, request, *args, **kwargs):

        print(*args, **kwargs)


        #serializer.save()
        return Response(data="创建成功", status=HTTP_200_OK, exception=None)

如何在休息框架视图中获取序列化程序字段?

1 个答案:

答案 0 :(得分:0)

您正在编写一个APIView派生类,它只是一个基于类的基本视图。 API Views旨在处理身份验证,内容类型协商等框架任务,将所有请求处理逻辑留给您。他们不了解serializer_classqueryset,这些是ModelViewSet的一部分。

值得庆幸的是,手动运行序列化程序并获取所需数据非常容易。你甚至可以为它增加400个错误。

def post(self, request, *args, **kwargs):
    ser = CloudServerCreateSerializer(
        data=request.data, 
        context={'request': request}
    )
    ser.is_valid(raise_exception=True)
    data = ser.validated_data
    # use the data somehow

一些注意事项:

  • context param包含序列化程序可以使用的额外数据。例如,request用于查找用于创建url字段的主机名。你可以忽略这一点。
  • is_valid(True)会将所有序列化程序错误提交回客户端,例如400或您抛出的任何错误。您之后不必重新验证其中的数据。
  • 除非您的网址指定路径参数,否则
  • *ars, **kwargs将为空。 /users/(?<username>\w+)/details/

如果您想使用此序列化模型到json,那么您将传递instance参数:

data = MySerializer(instance=MyModel.objects.first()).data

如果你想让ViewSet完全处理模型(获取,创建,列出,删除......),那么你想使用ModelViewSet

class CloudServerViewSet(ModelViewSet):
    serializer_class = CloudServerCreateSerializer
    permission_classes = []
    queryset = CloudServer.objects.all()

 router.register(r'clouds', CloudServerViewSet, base_name='clouds')
 # this will give you
 # POST  /prefix/clouds/      # create
 # GET   /prefix/clouds/      # list
 # GET   /prefix/clonds/:pk/  # details
 # PATCH /prefix/clonds/:pk/  # update