如何在最新的Django REST Framework中创建必需的布尔字段?

时间:2019-04-10 03:25:14

标签: django django-rest-framework

如何复制:

  1. 使用Foo创建Django模型django.db.models.BooleanField(),我们将其称为bar
  2. 使用Meta.fields = "__all__"创建一个非常基础的序列化器类。
  3. 更新:在现有序列化程序的顶部创建一个PolymorphicSerializer,并使用PolymorphicSerializer创建一个view + path。
  4. 尝试发布新的Foo不提供,。

会发生什么:请求返回HTTP 201已创建,并包含bar

应该发生什么:请求显然应该失败,并且响应指示需要bar=False

我在模型上也有一个必需的bar,并且尝试在没有 参数的情况下发布实例数据会导致“必需”错误消息

我没有使用Django表单,因此thisthis不是重复的。我已经尝试过this workaround,但是IntegerField失败,并显示“ KeyError:'required'”。 This other workaround似乎没有任何作用,可能是因为该字段也在模型上定义了。与this workaround相同。

使用djangorestframework == 3.9.2和django == 2.1.7。

2 个答案:

答案 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

屏幕截图

1。 DRF Web API控制台 enter image description here
2。 POSTMAN API控制台
enter image description here