使用Django rest框架发布空日期字段错误

时间:2017-10-22 06:11:22

标签: django django-rest-framework

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)不会收到错误。

如何解决?

3 个答案:

答案 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,因此您有两个选择:

  1. 发送前清理数据

清理"finish_date": ""-> "finish_date": null * 之前发送到您的服务器

如果您使用JavaScript提交表单,则可能需要执行以下操作:

if (data["finish_date"] == "") {
    data["finish_date"] = null;
}
  1. 接收后清除数据

在序列化程序中清理"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作为空白日期