model.py
class Form(models.Model):
no = models.IntegerField()
finish_date = models.DateField(blank=True, null=True)
serializers.py
class FormSerializer(serializers.ModelSerializer):
class Meta:
model = Form
fields = '__all__'
如果我尝试:
http http://127.0.0.1:8000/api/forms no=112 "finish_date"=""
它返回错误:
"finish_date": [
"Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]]."
]
如果我设置" finish_date"为null,这篇文章有效。
并且StringField(blank=True, null=True)
不会收到错误。
如何解决?
答案 0 :(得分:2)
现在在上面的模型中,你有一个DateField,而DateField接受的某些格式与帖子中的错误类似。当你发布时:
http http://127.0.0.1:8000/api/forms no=112 "finish_date"=""
您实际上是将一个空字符串("")传递给序列化程序,该序列化程序不是DateField的有效格式。而不是通过" finish_date" arg,我认为它会起作用。或者也许您可以在过去传递一些默认日期而不是传递空字符串。
答案 1 :(得分:2)
问题是DateTimeField
当前不支持allow_blank
关键字参数。
它确实支持allow_null
,因此您有两个选择:
清理"finish_date": ""
-> "finish_date": null
* 之前发送到您的服务器
如果您使用JavaScript提交表单,则可能需要执行以下操作:
if (data["finish_date"] == "") {
data["finish_date"] = null;
}
在序列化程序中清理"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)
Django Rest Framework Fields API Reference中多次提到.to_internal_value()
方法
答案 2 :(得分:0)
如果有人对此问题有疑问,并使用javascript客户端发布数据,请尝试发送undefined
作为空白日期