Django REST框架的APIClient发送None作为' None'

时间:2015-06-05 23:21:47

标签: python django django-rest-framework

在我的测试中,我发送了我通过序列化程序传递的模型的模拟数据。 serializer.data看起来像这样

{
    "field": None
}

但是,我的API收到的数据格式为

{
    "field": "None"
}

这是一个问题,因为我试图指定允许为空的外键。不应该APIClient将None转换为null而不是unicode吗?

有没有办法解决这个问题或绕过它?

这是我的序列化工具

class MyModelSerializer(serializers.ModelSerializer):

    field = serializers.PrimaryKeyRelatedField(
        queryset=OtherModel.objects.all(), required=False, allow_null=True)

我在视图集中创建方法

def create(self, request):
    model = MyModel()
    serializer = MyModelSerializer(model, data=request.data)
    if serializer.is_valid():
        serializer.save(owner=request.user)
        return Response(serializer.data, status=201)
    return Response(serializer.errors, status=406)

我的模特课

class MyModel(models.Model):
    field= models.OneToOneField(
        OtherModel, blank=True, null=True)

3 个答案:

答案 0 :(得分:3)

此处的问题是APIClient默认情况下将数据作为表单数据发送到视图,该数据没有Nonenull的概念,因此它是转换为unicode字符串None

好消息是,由于这个原因,Django REST框架将coerce a blank string to None用于关系字段。或者,您可以使用JSON并实际发送Nonenull,这应该没有问题。

答案 1 :(得分:0)

除了Kevin已经说过的内容之外,您还可以强制APIClient使用参数format='json'发送JSON。

请参阅documentation

答案 2 :(得分:0)

除现有答案外, 如果您期望null,这可能意味着您希望您的api接收json。

如果是这种情况,您可能希望将测试请求默认格式配置为json而不是form-data:

在你的setting.py中:

format='json'

这样,无需为每个请求添加{{1}}