如何为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,
答案 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将以{}作为初始值进行渲染,您可以选择也可以不选择对其进行修改。