如何复制:
Foo
创建Django模型django.db.models.BooleanField()
,我们将其称为bar
。Meta.fields = "__all__"
创建一个非常基础的序列化器类。PolymorphicSerializer
,并使用PolymorphicSerializer
创建一个view + path。Foo
,不提供,。会发生什么:请求返回HTTP 201已创建,并包含bar
。
应该发生什么:请求显然应该失败,并且响应指示需要bar=False
。
我在模型上也有一个必需的bar
,并且尝试在没有 参数做的情况下发布实例数据会导致“必需”错误消息
我没有使用Django表单,因此this和this不是重复的。我已经尝试过this workaround,但是IntegerField
失败,并显示“ KeyError:'required'”。 This other workaround似乎没有任何作用,可能是因为该字段也在模型上定义了。与this workaround相同。
使用djangorestframework == 3.9.2和django == 2.1.7。
答案 0 :(得分:1)
按照以下建议,将extra_kwargs
添加到您的ModelSerializer
中。
class FooSerializer(serializers.ModelSerializer):
class Meta:
model = Foo
fields = "__all__"
extra_kwargs = {'bar': {'required': True}}
在required=True
字段中设置了bar
个参数。
如果您还有其他疑问,请询问评论部分。
答案 1 :(得分:1)
免责声明:这不是OP的答案,但我在解释为什么DRF会出现这种行为
简而言之, 仅当您尝试通过HTML表单(DRF Web API Console) 进行POST时才会发生这种情况。如果您尝试通过POSTMAN Console, it will raise the Validation Error
如果您同时检查 request.data
的类型,它将为
| Request Source | Input data type |
|------------------ |----------------- |
| DRF HTML Input | QueryDict |
| POSTMAN API call | dict |
导致该行为的get_value()
method of Field
类。在这种情况下,
if html.is_html_input(dictionary):
....... do something
从该if子句中,EMPTY / BLANK值变为False
为您的序列化程序创建自定义布尔字段,将其覆盖为 get_value()
方法
from rest_framework.fields import empty
class CustomBooleanField(serializers.BooleanField):
def get_value(self, dictionary):
return dictionary.get(self.field_name, empty)
class FooSerializer(serializers.ModelSerializer):
bar = CustomBooleanField(required=True)
class Meta:
fields = '__all__'
model = Foo