Django REST Framework 的 APIClient 将 None 作为 'None' 发送
Django REST Framework's APIClient sends None as 'None'
在我的测试中,我发送了已通过序列化程序的模型的模拟数据。 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
class MyModel(models.Model):
field= models.OneToOneField(
OtherModel, blank=True, null=True)
这里的问题是 APIClient
默认将数据作为表单数据发送到视图,它没有 None
或 null
的概念,所以它被转换为 unicode 字符串 None
.
好消息是,出于这个原因,Django REST 框架将 coerce a blank string to None
用于关系字段。或者,您可以使用 JSON 并实际发送 None
或 null
,这应该没有问题。
除了 Kevin 已经说过的之外,您还可以使用参数 format='json'
.
强制 APIClient 发送 JSON
除了现有的答案,
如果您期待一个空值,这可能意味着您希望您的 api 收到 json.
如果是这种情况,您可能需要将测试请求默认格式配置为 json 而不是 form-data:
在你的setting.py中:
REST_FRAMEWORK = {
...
'TEST_REQUEST_DEFAULT_FORMAT': 'json'
}
这样就不需要在每个请求中添加format='json'
在我的测试中,我发送了已通过序列化程序的模型的模拟数据。 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
class MyModel(models.Model):
field= models.OneToOneField(
OtherModel, blank=True, null=True)
这里的问题是 APIClient
默认将数据作为表单数据发送到视图,它没有 None
或 null
的概念,所以它被转换为 unicode 字符串 None
.
好消息是,出于这个原因,Django REST 框架将 coerce a blank string to None
用于关系字段。或者,您可以使用 JSON 并实际发送 None
或 null
,这应该没有问题。
除了 Kevin 已经说过的之外,您还可以使用参数 format='json'
.
除了现有的答案, 如果您期待一个空值,这可能意味着您希望您的 api 收到 json.
如果是这种情况,您可能需要将测试请求默认格式配置为 json 而不是 form-data:
在你的setting.py中:
REST_FRAMEWORK = {
...
'TEST_REQUEST_DEFAULT_FORMAT': 'json'
}
这样就不需要在每个请求中添加format='json'