wgf*_*242 5 django django-rest-framework
模型.py
class Form(models.Model):
no = models.IntegerField()
finish_date = models.DateField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
序列化程序.py
class FormSerializer(serializers.ModelSerializer):
class Meta:
model = Form
fields = '__all__'
Run Code Online (Sandbox Code Playgroud)
如果我尝试:
http http://127.0.0.1:8000/api/forms no=112 "finish_date"=""
Run Code Online (Sandbox Code Playgroud)
它返回错误:
"finish_date": [
"Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]]."
]
Run Code Online (Sandbox Code Playgroud)
如果我将 "finish_date" 设置为 null ,则这篇文章有效。并且StringField(blank=True, null=True)
不会得到错误。
怎么解决?
问题是DateTimeField
当前不支持allow_blank
关键字参数。
但是它确实支持allow_null
,因此您有两个选择:
在发送到您的服务器之前擦洗"finish_date": ""
-> "finish_date": null
*
如果您使用 JavaScript 提交表单,您可能会执行以下操作:
if (data["finish_date"] == "") {
data["finish_date"] = null;
}
Run Code Online (Sandbox Code Playgroud)
擦洗"finish_date": ""
->"finish_date": None
在您的序列化程序中。
您可以轻松地做到这一点使用.to_internal_value()
上的方法ModelSerializer
class FormSerializer(serializers.ModelSerializer):
class Meta:
model = Form
fields = '__all__'
def to_internal_value(self, data):
# check for "finish_date": "" and convert to None
# This must be done before .validate()
if data['finish_date'] == '':
data['finish_date'] = None
return super(FormSerializer, self).to_internal_value(data)
Run Code Online (Sandbox Code Playgroud)
该.to_internal_value()
方法在Django Rest Framework Fields API Reference中有很多提到
现在在上面的模型中,您有一个 DateField,并且 DateField 接受某些格式类似于您帖子中错误中显示的格式。当您发布时:
http http://127.0.0.1:8000/api/forms no=112 "finish_date"=""
Run Code Online (Sandbox Code Playgroud)
您实际上是将一个空字符串 ("") 传递给序列化程序,这不是 DateField 的有效格式。而是在不传递“finish_date”参数的情况下尝试发布,我认为它会起作用。或者,也许您可以传递过去的某个默认日期,而不是传递空字符串。