【问题标题】:DRF Serializer boolean field not saving model defaultDRF 序列化器布尔字段不保存模型默认值
【发布时间】:2020-06-22 16:03:58
【问题描述】:

我正在使用 Django 2.2

我有一个带有布尔字段的模型

class MyModel(models.Model):
    is_active = models.BooleanField(default=True, blank=True)

和序列化器

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = [
            'is_active'
        ]

    def validate(self, attrs):
        print('attrs: {}'.format(attrs))
        return super().validate(attrs)

    def create(self, validated_data):
        print('validated_data: {}'.format(validated_data))
        return super().create(validated_data)

即使模型is_active 字段默认设置为Truevalidate() 方法中的attrscreate() 方法中的validated_data 包含is_activeFalse 如果@987654331 @ 没有与请求一起明确发送。

要将默认设置为True,我需要在序列化器类中显式添加序列化器字段

is_active = serializers.BooleanField(default=True, required=False)

为什么不设置模型字段的默认值?

【问题讨论】:

  • validate 方法中的打印输出是什么?
  • 它给了{'is_active': False}
  • 有效载荷是什么?
  • Payload 不包含 is_active 字段。从fields 列表中删除is_active 也可以正常工作,并且正在保存默认值。

标签: django django-rest-framework


【解决方案1】:

为什么不设置模型字段的默认值?

很可能是因为您正在发送 html 表单数据,而 HTML 规范说缺少布尔值意味着它是错误的。如果一个布尔值在表单有效载荷中,这意味着它是真的。

因此,默认值仅适用于 HTMl 表单以外的任何内容。

Django 有一个内置的解决方法 NullBooleanFieldDjango REST framework 虽然它们不同并且会显示为下拉菜单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2021-03-19
    • 2014-03-03
    • 2019-06-20
    相关资源
    最近更新 更多