我是django休息框架的新手,并且有一些关于我不完全理解的基本问题。我有一个python函数,它将字典作为输入,并希望通过API提供。
In [24]: def f(d):
...: pass
...:
我正在通过邮递员发送一个json文件测试一个帖子请求,该文件应该被翻译成我的python字典。我发送的输入看起来像
{
"test": {
"name1": {
"list": ["a",
"b",
"c"
],
"numbers": [0.0, 0.1]
}
}
}
正如您所看到的,这是一个目前有一个键name1
的词典,它本身就是一个带有两个键的词典list
和numbers
。
我为此示例编写的视图集如下所示:
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
所以我有以下两个问题:
我们可以看到request.data.get("test")
已经是所需的类型(dict
)。为什么我们要调用序列化程序并进行一些验证。这可能会将某些输入转换为非标准python类型。例如。通过DecimalField
验证小数返回类型为Decimal
的对象,它是Django类型而不是标准python类型。我是否需要在调用序列化程序后重新编写这个内容,或者我怎么知道这不会导致函数出现任何问题,例如原生python float64
类型?
如何在上面的示例中为字典定义序列化程序,以便返回正确的对象而不是None?该字典由一个由两个键组成的字典组成,其中一个值是小数列表,另一个是字符串列表。如何在DictField中为此编写验证?