Django Rest Framework JSON序列化程序字段验证失败,必需= False且没有默认值?

时间:2017-02-22 11:01:04

标签: django django-rest-framework

如何为django rest框架JSON序列化程序字段设置必需为false?无论所需的标志如何,似乎都在强制执行验证:

序列化器字段

results = serializers.JSONField(required=False, label='Result')

模型字段

results = models.TextField(blank=True, default="")

但是当我提交一个空白输入的表格时,我得到:

"results": [
    "Value must be valid JSON."
],

我也尝试在模型字段和序列化程序字段中将模型默认值更改为{},但响应相同。

更新

感谢@Linovia指出"所需的标志意味着如果该字段不存在则序列化程序不会抱怨"

经过一番挖掘,看起来DRF在输入上设置了一个默认值null,然后被捕获为无效...我怎样才能覆盖它,因为序列化器"默认"属性似乎没有任何影响。

 "results": null,

4 个答案:

答案 0 :(得分:4)

required标志表示如果该字段不存在,则序列化程序不会抱怨。 但是,如果它存在,它将遵循验证过程。它并不意味着如果不验证它将被丢弃。

答案 1 :(得分:2)

这似乎是DRF的empty类的问题(用于表示没有为给定的输入或输出值提供数据)。JSONField的空值不是json可序列化的,所以你看

"results": [
    "Value must be valid JSON."
],

要解决这个问题,我用我自己的NullableJSONField覆盖了DRF的JSONField

from rest_framework.fields import empty

class NullableJSONField(serializers.JSONField):

    def get_value(self, dictionary):
        result = super().get_value(dictionary)
        if result is empty:
            return None
        return result

并将allow_null=True添加到序列化程序

中的字段
json_blob = NullableJSONField(required=False, allow_null=True)

此修复程序的问题是,json_blob字段随后会在响应中使用None序列化。 (例如"json_blob": {}

我希望这可以解决您的问题,如果我找到一个完整的解决方案,当我没有输入时,我会发布更新。

答案 2 :(得分:0)

你可以使用类似......的语法。

class DetailSerializer(serializers.ModelSerializer):
results = ResultSerializer(

        allow_empty_file=True,required=False
    )

答案 3 :(得分:0)

供以后参考,一种成功且快速实现此方法的方法是使用序列化程序上的initial关键字,它将在模型实例中保存一个空dict(确保已将其与模型定义本身中的django JSONField耦合)

序列化器:

results = serializers.JSONField(required=False, initial=dict)

型号:

results = JSONField(default=dict)

可浏览的api将以{}作为初始值进行渲染,您可以选择也可以不选择对其进行修改。