Django通过DictField验证python字典

时间:2018-04-11 16:51:44

标签: python django-rest-framework django-serializer

我是django休息框架的新手,并且有一些关于我不完全理解的基本问题。我有一个python函数,它将字典作为输入,并希望通过API提供。

In [24]: def f(d):
    ...:     pass
    ...: 

我正在通过邮递员发送一个json文件测试一个帖子请求,该文件应该被翻译成我的python字典。我发送的输入看起来像

{
    "test": {
        "name1": {
            "list": ["a",
                "b",
                "c"
            ],
            "numbers": [0.0, 0.1]
        }
    }
}

正如您所看到的,这是一个目前有一个键name1的词典,它本身就是一个带有两个键的词典listnumbers

我为此示例编写的视图集如下所示:

class TestViewSet(viewsets.ViewSet):
    def create(self, request):
        serializer = TestSerializer(data=request.data)
        print(type(request.data.get("test")))
        if serializer.is_valid():
            print(serializer.validated_data.get("test"))
            f(serializer.validated_data.get("test"))

我的序列化器看起来像这样:

class TestSerializer(serializers.Serializer):

    test = serializers.DictField()

如果我发送上面的json输入,我会得到以下内容:

<type 'dict'>
None

所以我有以下两个问题:

  1. 我们可以看到request.data.get("test")已经是所需的类型(dict)。为什么我们要调用序列化程序并进行一些验证。这可能会将某些输入转换为非标准python类型。例如。通过DecimalField验证小数返回类型为Decimal的对象,它是Django类型而不是标准python类型。我是否需要在调用序列化程序后重新编写这个内容,或者我怎么知道这不会导致函数出现任何问题,例如原生python float64类型?

  2. 如何在上面的示例中为字典定义序列化程序,以便返回正确的对象而不是None?该字典由一个由两个键组成的字典组成,其中一个值是小数列表,另一个是字符串列表。如何在DictField中为此编写验证?

0 个答案:

没有答案